您的位置:首页 > 其它

[LeetCode]Merge k Sorted Lists

2016-09-30 19:39 281 查看
Question:

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

本题难度为hard。

刚开始我的思路是取出两条,用merge2Lists的方法合并为一条,再将这条和下一条用merge2Lists来合并为一条,以此类推。这种方法的结果就是超时。下面对其时间复杂度进行分析:

假设有K个list,每个list的平均长度为n
由于每次合并后,都会在原有长度基础上增加n。设第i次合并前,两个list长度分别是i*n,n。那么本次的复杂度就是i*n+n。(按最坏情况:一个list包含另一个list,且二者的最大值紧邻)
那么总时间复杂度=O(2n+3n+…+kn), 为O(nk²)


public class Solution {
public ListNode mergeKLists(ListNode[] lists) {
//require
int size=lists.length;
if(size==0||lists==null)
return null;

//invariant
ListNode l1=lists[0],l2;
for(int i=1;i<size;i++){
l2=lists[i];
l1=merge2Lists(l1,l2);

}
//ensure
return l1;
}

public ListNode merge2Lists(ListNode l1,ListNode l2){
while(true){
if(l1==null)return l2;
if(l2==null)return l1;
if(l1.val<l2.val){
l1.next=merge2Lists(l1.next,l2);
return l1;
}else{
l2.next=merge2Lists(l1,l2.next);
return l2;
}
}
}
}


第二种方法就是分治算法。时间复杂度为O(nklogk),AC过。

时间复杂度分析参考:leetcode——Merge k Sorted Lists

public class Solution {
public ListNode mergeKLists(ListNode[] lists) {
//require
int size=lists.length;
if(size==0||lists==null)
return null;

//invariant
return divide(lists,0,size-1);
}

public ListNode divide(ListNode[] lists,int l,int r){
int size=r-l+1;
if(size==1)
return lists[l];
if(size==2)
return merge2Lists(lists[l],lists[r]);
//divide,后序遍历
return merge2Lists(divide(lists,l,l+size/2),divide(lists,l+size/2+1,r));

}

public ListNode merge2Lists(ListNode l1,ListNode l2){
while(true){
if(l1==null)return l2;
if(l2==null)return l1;
if(l1.val<l2.val){
l1.next=merge2Lists(l1.next,l2);
return l1;
}else{
l2.next=merge2Lists(l1,l2.next);
return l2;
}
}
}
}


还有一种方法是利用最小堆。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  leetcode