分治算法 | 优先级队列:力扣23. 合并K个排序链表

1、题目描述:

分治算法 | 优先级队列:力扣23. 合并K个排序链表_第1张图片

2、题解:

方法1:分治算法:
链表两两合并

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution:
    def mergeKLists(self, lists: List[ListNode]) -> ListNode:
        #分治
        if not lists:return
        n = len(lists)
        return self.merge(lists,0,n-1)
    def merge(self,lists,left,right):
        if left == right:
            return lists[left]
        mid = left + (right - left) // 2
        l1 = self.merge(lists,left,mid)
        l2 = self.merge(lists,mid+1,right)
        return self.mergeTwoLists(l1,l2)
    def mergeTwoLists(self,l1,l2):
        if not l1:return l2
        if not l2:return l1
        if l1.val < l2.val:
            l1.next = self.mergeTwoLists(l1.next,l2)
            return l1
        else:
            l2.next = self.mergeTwoLists(l1,l2.next)
            return l2

3、复杂度分析:

方法1:
时间复杂度:O(kn x logk),k组链表,n为k组链表的最大长度
空间复杂度:O(logk)

你可能感兴趣的:(LeetCode)