diff --git a/work/1/Hard/Linked List/23.merge-k-sorted-lists.py b/work/1/Hard/Linked List/23.merge-k-sorted-lists.py new file mode 100644 index 0000000..eae790a --- /dev/null +++ b/work/1/Hard/Linked List/23.merge-k-sorted-lists.py @@ -0,0 +1,87 @@ +""" +23. Merge k Sorted Lists +Difficulty: Hard +https://leetcode.com/problems/merge-k-sorted-lists/ + +────────────────────────────────────────────────── + +You are given an array of k linked-lists lists, each linked-list is +sorted in ascending order. + +Merge all the linked-lists into one sorted linked-list and return it. + + + +Example 1: + +Input: lists = [[1,4,5],[1,3,4],[2,6]] +Output: [1,1,2,3,4,4,5,6] +Explanation: The linked-lists are: +[ + 1->4->5, + 1->3->4, + 2->6 +] +merging them into one sorted linked list: +1->1->2->3->4->4->5->6 + +Example 2: + +Input: lists = [] +Output: [] + +Example 3: + +Input: lists = [[]] +Output: [] + + + +Constraints: + + • k == lists.length + + • 0 <= k <= 10^4 + + • 0 <= lists[i].length <= 500 + + • -10^4 <= lists[i][j] <= 10^4 + + • lists[i] is sorted in ascending order. + + • The sum of lists[i].length will not exceed 10^4. +""" + +# Definition for singly-linked list. +# class ListNode: +# def __init__(self, val=0, next=None): +# self.val = val +# self.next = next +import heapq + + +class Solution: + def mergeKLists(self, lists: List[Optional[ListNode]]) -> Optional[ListNode]: + heap = [] + + # K log K + for i, node in enumerate(lists): + if node: + heapq.heappush(heap, (node.val, i, node)) + + D = ListNode() + cur = D + + # n log k + while heap: + val, i, node = heapq.heappop(heap) + cur.next = node + cur = node + node = node.next + + if node: + heapq.heappush(heap, (node.val, i, node)) + + # Time: O(N log k) + # Space: O(n) + return D.next