Skip to content

Commit a5687d5

Browse files
committed
- Merge K Sorted Lists DaleStudy#286
1 parent e23f7f4 commit a5687d5

File tree

1 file changed

+86
-0
lines changed

1 file changed

+86
-0
lines changed

merge-k-sorted-lists/ayosecu.py

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
from typing import List, Optional
2+
from heapq import heappush, heappop
3+
4+
# Definition for singly-linked list.
5+
class ListNode:
6+
def __init__(self, val=0, next=None):
7+
self.val = val
8+
self.next = next
9+
10+
class Solution:
11+
"""
12+
- Time Complexity: O(nlogk)
13+
- n = Total number of nodes in lists
14+
- k = The number of linked lists = len(lists)
15+
- Space Complexity: O(k)
16+
- Heap stores at most k elements at any time
17+
"""
18+
def mergeKLists(self, lists: List[Optional[ListNode]]) -> Optional[ListNode]:
19+
heap = []
20+
21+
for i, node in enumerate(lists):
22+
if node:
23+
heappush(heap, (node.val, i, node))
24+
25+
dummy = ListNode(0)
26+
tail = dummy
27+
28+
while heap:
29+
val, i, node = heappop(heap)
30+
tail.next = node
31+
tail = node
32+
if node.next:
33+
heappush(heap, (node.next.val, i, node.next))
34+
35+
return dummy.next
36+
37+
### TC Helpers ###
38+
def build_linked_list(values):
39+
dummy = ListNode(0)
40+
current = dummy
41+
for v in values:
42+
current.next = ListNode(v)
43+
current = current.next
44+
return dummy.next
45+
46+
def linked_list_to_list(node):
47+
result = []
48+
while node:
49+
result.append(node.val)
50+
node = node.next
51+
return result
52+
53+
### DO TEST ###
54+
def do_test():
55+
sol = Solution()
56+
57+
# TC 1
58+
lists = [
59+
build_linked_list([1, 4, 5]),
60+
build_linked_list([1, 3, 4]),
61+
build_linked_list([2, 6])
62+
]
63+
e = [1, 1, 2, 3, 4, 4, 5, 6]
64+
merged = sol.mergeKLists(lists)
65+
r = linked_list_to_list(merged)
66+
print(f"TC 1 is Passed!" if r == e else f"TC 1 is Failed! - Expected: {e}, Result: {r}")
67+
68+
# TC 2
69+
lists = [
70+
build_linked_list([]),
71+
build_linked_list([1]),
72+
build_linked_list([])
73+
]
74+
e = [1]
75+
merged = sol.mergeKLists(lists)
76+
r = linked_list_to_list(merged)
77+
print(f"TC 2 is Passed!" if r == e else f"TC 2 is Failed! - Expected: {e}, Result: {r}")
78+
79+
# TC 3
80+
lists = []
81+
e = []
82+
merged = sol.mergeKLists(lists)
83+
r = linked_list_to_list(merged)
84+
print(f"TC 3 is Passed!" if r == e else f"TC 3 is Failed! - Expected: {e}, Result: {r}")
85+
86+
do_test()

0 commit comments

Comments
 (0)