0
点赞
收藏
分享

微信扫一扫

[LeetCode]Merge k Sorted Lists


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;
}
}
}
}

还有一种方法是利用最小堆。


举报

相关推荐

0 条评论