Merge Two Sorted Lists

You are given the heads of two sorted linked lists list1 and list2.
Merge the two lists into one sorted linked list and return the head of the new sorted linked list.
The new list should be made up of nodes from list1 and list2.
Intuition
We are going compare nodes one by one from both of the lists and append the smaller node to a new Linked List. Initially List1 and List2 both are pointed at the HEAD of the Lists. According to the problem description, We need to select the smaller nodes from both of these Sorted Lists and Build a New Sorted Linked List (i.e. The Merged List from Two Sorted Lists).
To build a new Linked List we will follow DUMMY HEAD technique to skip edge case handling.
So we will Initialize a Dummy Node and a pointer curr pointing at the newly created dummy node (i.e. Dummy Head)

# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
def mergeTwoLists(self, list1: Optional[ListNode], list2: Optional[ListNode]) -> Optional[ListNode]:
dummy = ListNode() # creating the dummy node
curr = dummy # pointing curr pointer at dummy node
Now we will iterate over both of the lists list1 and list2 and compare their Node Values. Node that has Smaller value will be appended to the new Linked List next to the Dummy Head.
This loop will be continued until any of the lists reach to the NULL.
Let's write the code first and we will visualize the output later.
dummy = ListNode() # creating the dummy node
curr = dummy # pointing curr pointer at dummy node
while list1 and list2:
if list1.val < list2.val:
curr.next = list1
list1 = list1.next
else:
curr.next = list2
list2 = list2.next
curr = curr.next
Let's visualize the output of this above code.

As we can see, Node 1 is taken from List2 and appended to the new list. After that list2 and curr pointer moved to the next node. Let's repeat the process until either list1 or list2 reaches at the end of the List NULL

list1 pointer has reached at the NULL, so we will be out of the loop now. But we have remaining items in the list2. So we will just append the while chain of list2 to the new linked list like this

see the code bellow
# we are noe out of the while loop
# collecting the remaining items
# first checking for list1
if list1:
curr.next = list1
if list2:
curr.next = list2
But we can also use a shortcut in python like one-liner curr.next = list1 or list2. Because only one of the lists can have remaining items. So the outcome will be
Complete Code Snippet
class Solution:
def mergeTwoLists(self, list1: Optional[ListNode], list2: Optional[ListNode]) -> Optional[ListNode]:
dummy = ListNode()
curr = dummy
while list1 and list2:
if list1.val < list2.val:
curr.next = list1
list1 = list1.next
else:
curr.next = list2
list2 = list2.next
curr = curr.next
# collect the remaining items
curr.next = list1 or list2
# return the read HEAD of the new linked list, not dummy head
return dummy.next
That's it for now. Thanks for stopping by!
Connect with me on