您的位置:首页 > 其它

合并k个已排序的链表

2015-07-09 17:43 417 查看
最先想到的是把两个linked lists 合并成一个。

这样从第一个开始一个一个吞并,直到所有list都被合并。

class ListNode:# Definition for singly-linked list.
def __init__(self, x):
self.val = x
self.next = None
class Solution:
# @param {ListNode[]} lists
# @return {ListNode}
def mergeKLists_0(self, lists): #方法1
lists = [list for list in lists if list is not None]
if len(lists)<=0:
return lists
l=lists[0]
for i in range(1,len(lists)):
l=self.merge2lists(l,lists[i])
return l

def merge2lists(self,list_1,list_2):
# merge 2 linked list
if list_1 is None:
return list_2
if list_2 is None:
return list_1
if list_1.val>=list_2.val:
head_1=list_1      #big
head=head_2=list_2 #small
else:
head_1=list_2      #big
head=head_2=list_1 #small
while head_2.next!=None:
if head_2.next.val>head_1.val:
head_2.next,head_1=head_1,head_2.next
head_2=head_2.next
if head_1!=next:
head_2.next=head_1
return head


但是,所花费的时间代价太长,不通过。

方法2, 分治 递归, 借助于
mergesort
的思想。

def mergeKLists(self, lists):
lists = [list for list in lists if list is not None]
if len(lists)<=0:
return lists
if len(lists)==1:
return lists[0]
d=[]
for i in range(0,len(lists)-1,2):
l=self.merge2lists(lists[i],lists[i+1])
d.append(l)
if len(lists)%2==1:
d.append(lists[len(lists)-1])
return self.mergeKLists(d)


通过。

merge2lists(n,m)
平均需要比较(m+n)/2(m+n)/2 即O(n+m)O(n+m);

假设kk个已排序了的链表,每个链表的长度为nn;

“方法1”,完成所有的合并的时间复杂度为O(nk2)=O((n+n)+(2n+n)+...+((k−1)n+n))=O((k−1)∗kn/2+(k−1)n)O(nk^2)=O((n+n)+(2n+n)+...+((k-1)n+n))=O((k-1)*kn/2+(k-1)n)

“方法2”,每次递归的时候总共需要比较O(nk)O(nk)次,一共log(k)log(k)次递归,所以算法复杂度为O(nklog(k))O(nklog(k))
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: