Merge Two Sorted Lists

Problem

Merge two sorted linked lists and return it as a new list. The new list should be made by splicing together the nodes of the first two lists.

Solution

Recursive Solution: O(n) time, O(n) space

public class Solution {
    public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
        if (l1 == null) return l2;
        if (l2 == null) return l1;
        if (l1.val < l2.val) {
            l1.next = mergeTwoLists(l1.next, l2);
            return l1;
        }
        else {
            l2.next = mergeTwoLists(l1, l2.next);
            return l2;
        }
    }
}

Iterative Solution: O(n) time, O(1) space

public class Solution {
    public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
        if (l1 == null) return l2;
        if (l2 == null) return l1;
        ListNode dummy = new ListNode(0), cur = dummy; //To return the new head, we must have a reference to it
        while (l1 != null && l2 != null) {
            if (l1.val < l2.val) {
                cur.next = l1;
                l1 = l1.next;
            }  
            else {
                cur.next = l2;
                l2 = l2.next;
            }
            cur = cur.next; //node 
        }
        if (l1 == null) cur.next = l2;
        if (l2 == null) cur.next = l1;
        return dummy.next;
    }
}

Analysis

In the iterative solution
We use dummy to keep a reference to the head of list and cur to mark current sorted list
We set cur.next depending on the value of two nodes and move forward smaller node
Meanwhile, we need to move forward the cur node as well
After the while loop, we simply set the rest of list in case one of the node is not empty yet

In the typical recursive solution
We traversal two linked lists and return smaller ListNode after recursively setting its next
Notice how we avoid null by using the first two if statements

results matching ""

    No results matching ""