Skip to content

Commit ace478c

Browse files
committed
Add problem 21 - Merge Two Sorted Lists
1 parent 0d42752 commit ace478c

File tree

2 files changed

+78
-0
lines changed

2 files changed

+78
-0
lines changed
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
from typing import Optional
2+
3+
from problems.util.list_node import ListNode
4+
5+
6+
class MergeTwoSortedLists:
7+
@staticmethod
8+
def mergeTwoLists(head1: Optional[ListNode], head2: Optional[ListNode]) -> Optional[ListNode]:
9+
# Special cases
10+
if head1 is None:
11+
return head2
12+
if head2 is None:
13+
return head1
14+
# Head of the resultant list
15+
if head1.val < head2.val:
16+
head = ListNode(head1.val)
17+
head1 = head1.next
18+
else:
19+
head = ListNode(head2.val)
20+
head2 = head2.next
21+
# Pointer to traverse through the resultant list
22+
temp = head
23+
# Process both lists together
24+
while head1 is not None and head2 is not None:
25+
if head1.val < head2.val:
26+
temp.next = ListNode(head1.val)
27+
head1 = head1.next
28+
else:
29+
temp.next = ListNode(head2.val)
30+
head2 = head2.next
31+
temp = temp.next
32+
# Process remaining nodes in lists
33+
while head1 is not None:
34+
temp.next = ListNode(head1.val)
35+
head1 = head1.next
36+
temp = temp.next
37+
while head2 is not None:
38+
temp.next = ListNode(head2.val)
39+
head2 = head2.next
40+
temp = temp.next
41+
return head
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
import unittest
2+
3+
from problems.linked_list.merge_two_sorted_lists import MergeTwoSortedLists
4+
from problems.util.list_node import ListNode
5+
6+
7+
class MergeTwoListsTest(unittest.TestCase):
8+
def test_merge_two_lists(self):
9+
list1 = ListNode(1, ListNode(3, ListNode(5)))
10+
list2 = ListNode(2, ListNode(4, ListNode(6)))
11+
merged_list = MergeTwoSortedLists.mergeTwoLists(list1, list2)
12+
13+
self.assertEqual(merged_list.val, 1)
14+
self.assertEqual(merged_list.next.val, 2)
15+
self.assertEqual(merged_list.next.next.val, 3)
16+
self.assertEqual(merged_list.next.next.next.val, 4)
17+
self.assertEqual(merged_list.next.next.next.next.val, 5)
18+
self.assertEqual(merged_list.next.next.next.next.next.val, 6)
19+
20+
def test_merge_with_null_list(self):
21+
list1 = None
22+
list2 = ListNode(1, ListNode(2, ListNode(3)))
23+
merged_list = MergeTwoSortedLists.mergeTwoLists(list1, list2)
24+
25+
self.assertEqual(merged_list.val, 1)
26+
self.assertEqual(merged_list.next.val, 2)
27+
self.assertEqual(merged_list.next.next.val, 3)
28+
29+
def test_merge_both_null(self):
30+
list1 = None
31+
list2 = None
32+
merged_list = MergeTwoSortedLists.mergeTwoLists(list1, list2)
33+
self.assertIsNone(merged_list)
34+
35+
36+
if __name__ == '__main__':
37+
unittest.main()

0 commit comments

Comments
 (0)