Merge k Sorted Lists leetcode java

来源:互联网 发布:mac php集成环境工具 编辑:程序博客网 时间:2024/05/17 10:39

题目:

Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.

 

题解:

Merge k sorted linked list就是merge 2 sorted linked list的变形题。

而且我们很自然的就想到了经典的Merge Sort,只不过那个是对数组进行sort。而不同的地方,仅仅是Merge两个list的操作不同。

 

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

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

归并操作的过程如下:

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

 Merge Sort 对数组操作的Java代码为:

public int[] mergeSort(int[] arr){    if(arr.length<2||arr == null)        return arr;        MSort(arr,0,arr.length-1);}public int[] MSort(int[] arr, int low, int high){        if(low < high){                int mid = (low+high)/2;                int[] left = MSort(arr,low,mid);                int[] right = MSort(arr,mid+1,high);                return mergeTwoList(left,right);          }  }public int[] mergeTwoList(int[] A, int[] B) {    int[] C = new int[A.length + B.length];    int k = 0;    int i = 0;    int j = 0;    while(i < A.length && j < B.length) {        if (A[i] < B[j])            C[k++] = A[i++];        else            C[k++] = B[j++];    }    while (i < A.length)         C[k++] = A[i++];    while (j < B.length)         C[k++] = B[j++];    return C;}

下面就是这道题的解法,跟上面的方法一样一样的,就是在mergeTwoList时候是对linkedlist做,套用Merge 2 sorted list解法即可,代码如下:

public ListNode mergeKLists(ArrayList<ListNode> lists) {          if(lists==null || lists.size()==0)              return null;          return MSort(lists,0,lists.size()-1);      }          public ListNode MSort(ArrayList<ListNode> lists, int low, int high){          if(low < high){              int mid = (low+high)/2;            ListNode leftlist = MSort(lists,low,mid);            ListNode rightlist = MSort(lists,mid+1,high);            return mergeTwoLists(leftlist,rightlist);          }          return lists.get(low);      }    public ListNode mergeTwoLists(ListNode l1, ListNode l2) {            if(l1==null)                return l2;            if(l2==null)                return l1;                            ListNode l3;            if(l1.val<l2.val){                l3 = l1;                l1 = l1.next;            }else{                l3 = l2;                l2 = l2.next;            }                        ListNode fakehead = new ListNode(-1);            fakehead.next = l3;            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)                l3.next = l1;            if(l2!=null)                l3.next = l2;            return fakehead.next;        }


Reference:http://www.cnblogs.com/springfor/p/3869217.html

更多Mergesort的讲法请参考:http://www.cs.princeton.edu/courses/archive/spr07/cos226/lectures/04MergeQuick.pdf

讲的挺好的