21. Merge Two Sorted Lists

We’re given two sorted linked lists where each node has an integer value. We’re asked to merge the two linked lists, maintaining their sorted property, and return the head. Pretty straightforward, we traverse both linked lists simultaneously comparing their values. We maintain a dummy node to keep track of the new head, and we maintain a head to add nodes to the merged linked list.

If the value in list1 is less than the value in list2, we append it to the list, else we append the value from list2 to the list. Finally, we check to make sure no nodes remain in list1 and list2. If nodes remain, we append them.

Then we return dummy.next, which is the head node of the new merged linked list.

The solution is as follows:

class Solution:
    def mergeTwoLists(self, list1: Optional[ListNode], list2: Optional[ListNode]) -> Optional[ListNode]:
        dummy = ListNode()
        head = dummy
 
        while list1 and list2:
            if list1.val < list2.val:
                head.next, list1 = list1, list1.next
            else:
                head.next, list2 = list2, list2.next
 
            head = head.next
 
        while list1:
            head.next, list1 = list1, list1.next
            head = head.next
 
        while list2:
            head.next, list2 = list2, list2.next
            head = head.next
 
        return dummy.next

_ Time Complexity:

O(n + m) - We traverse all nodes within lists 1 and 2.

_ Space Complexity:

O(1) - We maintain a dummy node to keep track of the head of the new linked list.