[LeetCode] 23. Merge k Sorted Lists_Hard tag: Linked List

Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.

Example:

Input:
[
  1->4->5,
  1->3->4,
  2->6
]
Output: 1->1->2->3->4->4->5->6

这个题目利用divide and conquer的方式去将k分为k/2 然后分别去merge,然后递归,接着利用[LeetCode] 21. Merge Two Sorted Lists_Easy tag: Linked List将两者merge即可。

时间复杂度为 O(lg(k) * n)   # k is len(lists)    # n is total nodes of lists   # 因为每次分为两半,将k不停的二分,然后每一层都要遍历n个nodes。

code

class ListNode:
    def __init__(self, x):
        self.val = x
        self.next = None

class Solution:
    def mergeKSortedLists(self, lists: list[ListNode]) -> ListNode:
        if not lists or len(lists) == 0:
            return 
        def helper(lists, start, end):
            if start == end:
                return lists[start]
            middle = start + (end - start)//2
            left = helper(lists, start, middle)
            right = helper(lists, middle + 1, end)
            return merge(left, right)
        def mergeTwoSortedLists(head1, head2):
            if not head1 or not head2:
                return head1 or head2
            dummy = ListNode(0)
            head = dummy
            while head1 and head2:
                if head1.val <= head2.val:
                    head.next = head1
                    head1 = head1.next
                else:
                    head.next = head2
                    head2 = head2.next
                head = head.next
            head.next = head1 if head1 else head2
            return dummy.next
        return helper(lists, 0, len(lists) - 1)

猜你喜欢

转载自www.cnblogs.com/Johnsonxiong/p/10804665.html