【题目描述】bash
采用分治,两两合并,直至只有一个链表为止。从8个链表变成4,再变成2,最后获得一个链表。app
【源代码】优化
时间复杂度为O(Nlogk),k为总链表个数,N为链表总节点数。ui
空间复杂度为k/2+k/4+...+1,等比数列求和等于O(k)。spa
空间复杂度还能够进一步优化为O(1),能够参考这个见方法5code
class Solution:
def mergeKLists(self, lists: List[ListNode]) -> ListNode:
if len(lists)==0:
return None
if len(lists)==1:
return lists[0]
left=0
right=len(lists)-1
newlist=[]
while left<right:
newlist.append(self.merge2link(lists[left],lists[right]))
left+=1
right-=1
if left==right:
newlist.append(lists[left])
return self.mergeKLists(newlist)
def merge2link(self,head1,head2):
if head1!=None and head2!=None:
if head1.val<head2.val:
mergehead=head1
else:
mergehead=head2
elif head1==None:
return head2
elif head2==None:
return head1
else:
return None
while head1!=None and head2!=None:
if head1.val<head2.val:
while head1.next!=None and head1.next.val<=head2.val:
head1=head1.next
next1=head1.next
head1.next=head2
head1=next1
else:
while head2.next!=None and head2.next.val<=head1.val:
head2=head2.next
next2=head2.next
head2.next=head1
head2=next2
return mergehead
复制代码