每日一道算法题--leetcode 23--合并k个排序链表--python

421 阅读1分钟

【题目描述】

【思路解析】

采用分治,两两合并,直至只有一个链表为止。从8个链表变成4,再变成2,最后得到一个链表。

【源代码】

时间复杂度为O(Nlogk),k为总链表个数,N为链表总节点数。

空间复杂度为k/2+k/4+...+1,等比数列求和等于O(k)。

空间复杂度还可以进一步优化为O(1),可以参考这个见方法5

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