Skip to content

Commit a31e187

Browse files
committed
Added merge-k-sorted-list algo in linked list section
1 parent a71618f commit a31e187

1 file changed

Lines changed: 92 additions & 0 deletions

File tree

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
from __future__ import annotations
2+
from collections.abc import Iterable, Iterator
3+
from dataclasses import dataclass
4+
import heapq
5+
6+
7+
test_data_odd = (3, 9, -11, 0, 7, 5, 1, -1)
8+
test_data_even = (4, 6, 2, 0, 8, 10, 3, -2)
9+
test_data_mixed = (1, 4, 7), (2, 5, 8), (3, 6, 9)
10+
11+
12+
@dataclass
13+
class Node:
14+
data: int
15+
next_node: Node | None
16+
17+
18+
class SortedLinkedList:
19+
def __init__(self, ints: Iterable[int]) -> None:
20+
self.head: Node | None = None
21+
for i in sorted(ints, reverse=True):
22+
self.head = Node(i, self.head)
23+
24+
def __iter__(self) -> Iterator[int]:
25+
node = self.head
26+
while node:
27+
yield node.data
28+
node = node.next_node
29+
30+
def __len__(self) -> int:
31+
return sum(1 for _ in self)
32+
33+
def __str__(self) -> str:
34+
return " -> ".join([str(node) for node in self])
35+
36+
37+
def merge_two_lists(
38+
sll_one: SortedLinkedList, sll_two: SortedLinkedList
39+
) -> SortedLinkedList:
40+
"""Merge two sorted linked lists."""
41+
return SortedLinkedList(list(sll_one) + list(sll_two))
42+
43+
44+
def merge_k_sorted_lists(lists: list[SortedLinkedList]) -> SortedLinkedList:
45+
"""
46+
Merge k sorted linked lists into one sorted linked list.
47+
48+
>>> SSL = SortedLinkedList
49+
>>> lists = [SSL([1, 4, 7]), SSL([2, 5, 8]), SSL([3, 6, 9])]
50+
>>> merged = merge_k_sorted_lists(lists)
51+
>>> str(merged)
52+
'1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7 -> 8 -> 9'
53+
>>> len(merged)
54+
9
55+
"""
56+
# Create a min-heap (stores tuples of value, index, node)
57+
heap: list[tuple[int, int, Node]] = []
58+
for i, sll in enumerate(lists):
59+
if sll.head:
60+
heapq.heappush(heap, (sll.head.data, i, sll.head))
61+
62+
dummy = Node(0, None)
63+
current = dummy
64+
65+
while heap:
66+
value, idx, node = heapq.heappop(heap)
67+
current.next_node = Node(value, None)
68+
current = current.next_node
69+
70+
if node.next_node:
71+
heapq.heappush(heap, (node.next_node.data, idx, node.next_node))
72+
73+
# Convert to SortedLinkedList for consistency
74+
result = SortedLinkedList([])
75+
result.head = dummy.next_node
76+
return result
77+
78+
79+
if __name__ == "__main__":
80+
import doctest
81+
82+
doctest.testmod()
83+
SSL = SortedLinkedList
84+
85+
# Example usage
86+
list1 = SSL(test_data_odd)
87+
list2 = SSL(test_data_even)
88+
list3 = SSL([-15, -10, -5, 0, 5])
89+
merged_k = merge_k_sorted_lists([list1, list2, list3])
90+
91+
print("Merged K Sorted Lists:")
92+
print(merged_k)

0 commit comments

Comments
 (0)