题解 | #合并k个已排序的链表#

合并k个已排序的链表

http://www.nowcoder.com/practice/65cfde9e5b9b4cf2b6bafa5f3ef33fa6

分治法,先合并left-mid,再合并mid+1-right,然后再将两边合并,注意递归返回的条件
/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) {
 *         val = x;
 *         next = null;
 *     }
 * }
 */
import java.util.*;
public class Solution {
    public ListNode mergeKLists(ArrayList<ListNode> lists) {
//         ListNode dummy=new ListNode(0);
//         ListNode p1=dummy;
//         int n=lists.size();
//         ListNode[] pointer=new ListNode[n];
//         for(int i=0;i<n;i++){
//             pointer[i]=lists.get(i);
//         }
//         while(true){
//             int min=Integer.MAX_VALUE;
//             int memo=-1;
//             for(int j=0;j<n;j++){
//                 if(pointer[j]!=null)
//                 {if(pointer[j].val<=min){
//                     min=pointer[j].val;
//                     memo=j;
//                 }
//                 }
//             }
//             if(memo==-1)
//                 break;
//             dummy.next=pointer[memo];
//             dummy=dummy.next;
//             pointer[memo]=pointer[memo].next;
//         }
//         dummy.next=null;
//         return p1.next;
        return merge(lists,0,lists.size()-1);
        
    }
    ListNode merge(ArrayList<ListNode> lists,int left,int right){
        if(left==right){
            return lists.get(left);
        }
        else if(left>right){
            return null;
        }
        int mid=(left+right)/2;
        ListNode resL=merge(lists,left,mid);
        ListNode resR=merge(lists,mid+1,right);
        return mergeTowList(resL,resR);
    }
    ListNode mergeTowList(ListNode l1,ListNode l2){
        if(l1==null){
            return l2;
        }
        else if(l2==null){
            return l1;
        }
        ListNode dummy=new ListNode(0);
        ListNode p1=dummy;
        while(l1!=null&&l2!=null){
            if(l1.val<l2.val)
            {
                dummy.next=l1;
                l1=l1.next;
            }
            else
            {
                dummy.next=l2;
                l2=l2.next;
            }
            dummy=dummy.next;
        }
        if(l1==null){
            dummy.next=l2;
        }
        else if(l2==null){
            dummy.next=l1;
        }
        else
            dummy.next=null;
        return p1.next;

        
    }
}
全部评论

相关推荐

把球:这个听过,你加了就会发现是字节的hr
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务