Merge k Sorted Lists

也很简单,关键是掌握mergeSort

见ref   http://www.cnblogs.com/springfor/p/3869217.html, 摘抄

 

这里来复习一下Merge Sort(对于数组操作),参考Wikipedia:

归并操作(merge),也叫归并算法,指的是将两个已经排序的序列合并成一个序列的操作。归并排序算法依赖归并操作。

归并操作的过程如下:

  1. 申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列
  2. 设定两个指针,最初位置分别为两个已经排序序列的起始位置
  3. 比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置
  4. 重复步骤3直到某一指针到达序列尾
  5. 将另一序列剩下的所有元素直接复制到合并序列尾

 

最差時間複雜度 \Theta(n\log n)
最優時間複雜度 \Theta(n)
平均時間複雜度 \Theta(n\log n)
最差空間複雜度 \Theta(n)

public class Solution {
    public ListNode mergeKLists(ArrayList<ListNode> lists) {
        if(lists==null || lists.size() <1) return null;
        return MergeSort(0, lists.size() -1, lists);
    }
    
    public ListNode MergeSort(int start, int end, ArrayList<ListNode> lists){
        if(start<end){
            int mid = start +(end-start)/2;
            ListNode left = MergeSort(start, mid, lists);
            ListNode right = MergeSort(mid+1, end, lists);
            return merge2lists(left, right);
        }
        return lists.get(start);
    }
    
    public ListNode merge2lists(ListNode l1, ListNode l2){
        ListNode h = new ListNode(-1);
        ListNode l3 = h;
        while(l1!=null && l2!=null){
            if(l1.val<l2.val){
                l3.next = l1;
                l3 =l3.next;
                l1 =l1.next;
            }else{
                l3.next = l2;
                l3 =l3.next;
                l2 = l2.next;
            }
        }
        if(l1==null && l2!=null) l3.next = l2;
        if(l2==null && l1!=null) l3.next = l1;
        
        return h.next;
    }
}

 

posted @ 2015-04-07 04:23  世界到处都是小星星  阅读(248)  评论(0编辑  收藏  举报