Skip to content

Commit fd11a7c

Browse files
committed
add merge linked lists algorithms
1 parent 40b4c5a commit fd11a7c

File tree

1 file changed

+66
-0
lines changed

1 file changed

+66
-0
lines changed
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
from typing import Optional
2+
3+
4+
class ListNode:
5+
def __init__(self, val=0, next=None):
6+
self.val = val
7+
self.next = next
8+
9+
def __str__(self):
10+
s = self
11+
ret = []
12+
while s:
13+
ret.append(s.val)
14+
s = s.next
15+
return str(ret)
16+
17+
18+
def mergeTwoLists(l1: ListNode, l2: ListNode) -> ListNode:
19+
if not l1:
20+
return l2
21+
if not l2:
22+
return l1
23+
24+
if l1.val < l2.val:
25+
result = l1.val
26+
l1 = l1.next
27+
else:
28+
result = l2.val
29+
l2 = l2.next
30+
31+
return ListNode(result, mergeTwoLists(l1, l2))
32+
33+
def mergeKLists(lists: list[Optional[ListNode]]) -> Optional[ListNode]:
34+
nodes = []
35+
result = curr = ListNode()
36+
37+
for lst in lists:
38+
while lst:
39+
nodes.append(lst.val)
40+
lst = lst.next
41+
42+
for node in sorted(nodes):
43+
curr.next = ListNode(node)
44+
curr = curr.next
45+
46+
return result.next
47+
48+
49+
if __name__ == "__main__":
50+
# TESTS
51+
l1 = ListNode(1, ListNode(4, ListNode(81)))
52+
l2 = ListNode(1, ListNode(3, ListNode(4)))
53+
l3 = ListNode(2, ListNode(3, ListNode(5)))
54+
l4 = ListNode(2, ListNode(3, ListNode(5)))
55+
l5 = ListNode(2, ListNode(26, ListNode(73)))
56+
l6 = ListNode(2, ListNode(3, ListNode(62)))
57+
l7 = ListNode(6, ListNode(10, ListNode(20)))
58+
l8 = ListNode(2, ListNode(3, ListNode(51)))
59+
l9 = ListNode(2, ListNode(3, ListNode(12)))
60+
l10 = ListNode(3, ListNode(10, ListNode(20)))
61+
l11 = ListNode(2, ListNode(3, ListNode(5)))
62+
l12 = ListNode(2, ListNode(3, ListNode(66)))
63+
l13 = ListNode(5, ListNode(6, ListNode(6)))
64+
65+
print(mergeTwoLists(l1, l2))
66+
print(mergeKLists([l1, l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12, l13]))

0 commit comments

Comments
 (0)