To merge two sorted linked lists, we can either use a recursive approach or an iterative
approach:
Approach 1: Recursive Approach - Handle
edge cases
where
one of the lists is empty.
Compare the current nodes
of both lists.
Recursively
merge the
remaining lists and link the smaller node to
the result.
Approach 2: Iterative Approach - Start by handling
edge cases
where one of the lists is empty.
Ensure list1 always points
to the smaller starting node.
Use a prev pointer
to
keep track of the last node in the merged list. Traverse both lists,
appending the smaller
node
to the merged list and updating pointers.
class Solution { public: ListNode* mergeTwoLists(ListNode* list1, ListNode* list2) { if(list1==NULL) return list2; if(list2==NULL) return list1; if(list1->val < list2->val){ list1->next = mergeTwoLists(list1->next,list2); return list1; } else{ list2->next = mergeTwoLists(list1,list2->next); return list2; } } };
class Solution { public: ListNode* mergeTwoLists(ListNode* &list1, ListNode* &list2) { if(list1==NULL) return list2; if(list2==NULL) return list1; if(list1->val > list2->val){ ListNode* tmp = list1; list1 = list2; list2 = tmp; } ListNode* newHead = list1; while(list1!=NULL && list2!=NULL){ ListNode* prev = NULL; while(list1!=NULL && list1->val <= list2->val){ prev = list1; list1 = list1->next; } prev->next = list2; ListNode* tmp = list1; list1 = list2; list2 = tmp; } return newHead; } };
Both approaches iterate through all nodes of the two lists, where 'n'
and 'm'
are the
lengths of the two lists.
The recursive approach uses stack space proportional to the sum of the lengths of the two lists, while the iterative approach uses constant space.