Skip to main content

Command Palette

Search for a command to run...

LeetCode — Merge Two Sorted Lists

Published
5 min readView as Markdown
LeetCode — Merge Two Sorted Lists

Problem statement

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

Problem statement taken from: https://leetcode.com/problems/merge-two-sorted-lists

Example 1:

Input: l1 = [1, 2, 4], l2 = [1, 3, 4]  
Output: [1, 1, 2, 3, 4, 4]

Example 2:

Input: l1 = [], l2 = []  
Output: []

Example 3:

Input: l1 = [], l2 = [0]  
Output: [0]

Constraints:

- The number of nodes in both lists is in the range [0, 50].  
- -100 <= Node.val <= 100  
- Both l1 and l2 are sorted in non-decreasing order.

Explanation

Since the lists are sorted, we can just compare the nodes of the lists and append the smaller node to the new list.

Let’s check the algorithm for this approach.

- return list l2 if list l1 == null  

- return list l1 if list l2 == null  

- set ListNode *head = null  

- if l1->val < l2->val  
  - set head = l1  
  - move ahead l1 = l1->next  
- else  
  - set head = l2  
  - move ahead l2 = l2->next  

- initialize ListNode *p and set p = head  

- while(l1 && l2) // l1 and l2 both are not null  
  - if l1->val < l2->val  
    - set p->next = l1  
    - set l1 = l1->next  
  - else  
    - set p->next = l2  
    - set l2 = l2->next  

  - set p = p->next  

// append the pending elements of the remaining list  
- if l1 != null  
  - set p->next = l1  
- else  
  - set p->next = l2

C++ solution

class Solution {  
public:  
    ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {  
        if (l1 == NULL){  
            return l2;  
        }  

        if(l2 == NULL) {  
            return l1;  
        }  

        ListNode *head = NULL;  

        if(l1->val < l2->val){  
            head = l1;  
            l1 = l1->next;  
        } else {  
            head = l2;  
            l2 = l2->next;  
        }  

        ListNode *p;  
        p = head;  

        while(l1 && l2){  
            if(l1->val < l2->val){  
                p->next = l1;  
                l1 = l1->next;  
            } else {  
                p->next = l2;  
                l2 = l2->next;  
            }  

            p = p->next;  
        }  

        if(l1 != NULL){  
            p->next = l1;  
        } else {  
            p->next = l2;  
        }  

        return head;  
    }  
};

Golang solution

func mergeTwoLists(l1 *ListNode, l2 *ListNode) *ListNode {  
    if l1 == nil {  
        return l2  
    }  

    if l2 == nil {  
        return l1  
    }  

    var head *ListNode  

    if l1.Val < l2.Val {  
        head = l1  
        l1 = l1.Next  
    } else {  
        head = l2  
        l2 = l2.Next  
    }  

    var p *ListNode;  
    p = head;  

    for l1 != nil && l2 != nil {  
        if l1.Val < l2.Val {  
            p.Next = l1  
            l1 = l1.Next  
        } else {  
            p.Next = l2  
            l2 = l2.Next  
        }  

        p = p.Next  
    }  

    if l1 != nil {  
        p.Next = l1  
    } else {  
        p.Next = l2  
    }  

    return head  
}

Javascript solution

var mergeTwoLists = function(l1, l2) {  
    if( !l1 ){  
        return l2;  
    }  

    if( !l2 ){  
        return l1;  
    }  

    let head = new ListNode(0, null);  

    if( l1.val < l2.val ){  
        head = l1;  
        l1 = l1.next;  
    } else {  
        head = l2;  
        l2 = l2.next;  
    }  

    let p = head;  

    while(l1 && l2) {  
        if (l1.val < l2.val) {  
            p.next = l1;  
            l1 = l1.next;  
        } else {  
            p.next = l2;  
            l2 = l2.next;  
        }  

        p = p.next;  
    }  

    if( l1 ){  
        p.next = l1;  
    } else {  
        p.next = l2;  
    }  

    return head;  
};

Let’s dry-run our algorithm to see how the solution works.

Input: l1 = [1, 2, 4], l2 = [1, 3, 4]  

Step 1: if l1 == NULL  
        false  

Step 2: if l2 == NULL  
        false  

Step 3: ListNode *head = NULL;  

Step 4: if l1->val < l2->val  
        1 < 1  
        false  

        head = l2  

        head  
          |  
          1 -> 3 -> 4  

        l2 = l2->next  

               l2  
               |  
          1 -> 3 > 4  

Step 5: ListNode *p  
        p = head  


        head, p  
          |  
          1 -> 3 -> 4  

Step 6: loop while l1 && l2  
        true && true  
        true  

        - if l1->val < l2->val  
          1 < 3  
          true  

          p->next = l1  

          head, p  
           |  
           1 -> 1  

          l1 = l1->next  

               l1  
               |  
          1 -> 2 -> 4  

          p = p->next  

          head  p  
           |    |  
           1 -> 1  

Step 7: loop while l1 && l2  
        true && true  
        true  

        - if l1->val < l2->val  
          2 < 3  
          true  

          p->next = l1  

          head  p  
           |    |  
           1 -> 1 -> 2  

          l1 = l1->next  

                   l1  
                    |  
          1 -> 2 -> 4  

          p = p->next  

          head       p  
           |         |  
           1 -> 1 -> 2  

Step 8: loop while l1 && l2  
        true && true  
        true  

        - if l1->val < l2->val  
          4 < 3  
          false  

          p->next = l2  

          head       p  
           |         |  
           1 -> 1 -> 2 -> 3  

          l2 = l2->next  

                   l2  
                    |  
          1 -> 3 -> 4  

          p = p->next  

          head            p  
           |              |  
           1 -> 1 -> 2 -> 3  

Step 9: loop while l1 && l2  
        true && true  
        true  

        - if l1->val < l2->val  
          4 < 4  
          false  

          p->next = l2  

          head            p  
           |              |  
           1 -> 1 -> 2 -> 3 -> 4  

           l2 = l2->next  

                         l2  
                          |  
          1 -> 3 -> 4 -> null  

          p = p->next  

          head                 p  
           |                   |  
           1 -> 1 -> 2 -> 3 -> 4  

Step 10: loop while l1 && l2  
         true && false  
         false  

Step 11: if l1 != NULL  
         true  

         p->next = l1  

         head                 p  
          |                   |  
          1 -> 1 -> 2 -> 3 -> 4 -> 4  

Step 12: return head;  

         head  
          |  
          1 -> 1 -> 2 -> 3 -> 4 -> 4

More from this blog

Alkesh Ghorpade's Blog

137 posts