Skip to content
On this page

Add Two Numbers Medium

Question

You are given two non-empty linked lists representing two non-negative integers. The digits are stored in reverse order, and each of their nodes contains a single digit. Add the two numbers and return the sum as a linked list.

You may assume the two numbers do not contain any leading zero, except the number 0 itself.

txt
Input: l1 = [2,4,3], l2 = [5,6,4]
Output: [7,0,8]
Explanation: 342 + 465 = 807.
txt
Input: l1 = [0], l2 = [0]
Output: [0]
txt
Input: l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]
Output: [8,9,9,9,0,0,0,1]
txt
The number of nodes in each linked list is in the range [1, 100].
0 <= Node.val <= 9
It is guaranteed that the list represents a number that does not have leading zeros.

Solution

python
def addTwoNumbers(l1, l2):
    dummy_head = ListNode(0)
    current = dummy_head
    carry = 0

    while l1 or l2 or carry:
        sum_val = carry
        if l1:
            sum_val += l1.val
            l1 = l1.next
        if l2:
            sum_val += l2.val
            l2 = l2.next

        carry = sum_val // 10
        current.next = ListNode(sum_val % 10)
        current = current.next

    return dummy_head.next
java
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
    ListNode dummyHead = new ListNode(0);
    ListNode current = dummyHead;
    int carry = 0;

    while (l1 != null || l2 != null || carry != 0) {
        int sum = carry;
        if (l1 != null) {
            sum += l1.val;
            l1 = l1.next;
        }
        if (l2 != null) {
            sum += l2.val;
            l2 = l2.next;
        }

        carry = sum / 10;
        current.next = new ListNode(sum % 10);
        current = current.next;
    }

    return dummyHead.next;
}
javascript
function addTwoNumbers(l1, l2) {
    const dummyHead = new ListNode(0);
    let current = dummyHead;
    let carry = 0;

    while (l1 || l2 || carry) {
        let sum = carry;
        if (l1) {
            sum += l1.val;
            l1 = l1.next;
        }
        if (l2) {
            sum += l2.val;
            l2 = l2.next;
        }

        carry = Math.floor(sum / 10);
        current.next = new ListNode(sum % 10);
        current = current.next;
    }

    return dummyHead.next;
}

Notes

In this problem, we are given two linked lists representing non-negative integers, where each node contains a single digit, and the digits are stored in reverse order. Our goal is to add the two numbers and return the sum as a new linked list.

Definition of ListNode:

Before we proceed with the solutions, we'll define the ListNode class in all three languages to represent the nodes of the linked list.

python
class ListNode:

    def __init__(self, val=0, next=None):

    self.val = val


self.next = next
java
public class ListNode {
    int val;
    ListNode next;

    ListNode() {
    }

    ListNode(int val) {
        this.val = val;
    }

    ListNode(int val, ListNode next) {
        this.val = val;
        this.next = next;
    }
}
javascript
class ListNode {
    constructor(val = 0, next = null) {
        this.val = val;
        this.next = next;
    }
}

Solution Explanation:

We'll traverse both linked lists simultaneously, summing the corresponding digits and handling carry if present. The sum of two digits can be greater than 9, in which case we need to carry the extra digit to the next node.

We'll initialize a dummy node to keep track of the head of the result linked list and two pointers to traverse the input linked lists. As we iterate through the lists, we'll add the values of the nodes and the carry (if any) to compute the sum at the current position.

Time Complexity:

The time complexity of the solution is O(max(m, n)), where m and n are the lengths of the two input linked lists. We need to traverse both lists to calculate the sum, and the length of the resulting linked list is at most max(m, n) + 1.

Space Complexity:

The space complexity of the solution is O(max(m, n)). It's because we create a new linked list to store the result, and the length of the resulting linked list is at most max(m, n) + 1, where m and n are the lengths of the input linked lists. Additionally, we use a constant amount of extra space for variables current and carry.