[LeetCode] 23. Merge k Sorted Lists_Hard tag: Linked List
2019-05-03 11:33 Johnson_强生仔仔 阅读(176) 评论(0) 编辑 收藏 举报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 mergeTwoSortedLists(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)
Code: T: O(k * n) S: O(1)
# Definition for singly-linked list. # class ListNode(object): # def __init__(self, val=0, next=None): # self.val = val # self.next = next class Solution(object): def mergeKLists(self, lists): """ :type lists: List[ListNode] :rtype: ListNode """ k = len(lists) if k == 0: return if k == 1: return lists[0] return self.mergeKLists([self.merge2Lists(lists[0], lists[1])] + lists[2:]) def merge2Lists(self, l1, l2): dummy = ListNode() head = dummy while l1 and l2: if l1.val <= l2.val: head.next = l1 l1 = l1.next else: head.next = l2 l2 = l2.next head = head.next head.next = l1 if l1 else l2 return dummy.next