DDSA Solutions

Add Number Linked Lists

Time: O(max(n,m))
Space: O(max(n,m))
Advertisement

Intuition

Add two numbers stored as linked lists (digits in order). Reverse both, add with carry, reverse result.

Algorithm

  1. 1Reverse both lists. Add digit by digit with carry. If carry remains: add new node. Reverse result list.

Common Pitfalls

  • Same as LC 2 but digits may be stored in forward order. Handle different lengths with zero-padding.
Add Number Linked Lists.java
Java
// Approach: Reverse both linked lists, add digit by digit with carry, build result list, reverse it.
// Time: O(max(n,m)) Space: O(max(n,m))
class Node {
    int data;
    Node next;

    Node(int d) {
        data = d;
        next = null;
    }
}

class Solution {
    // Function to add two numbers represented by linked list.
    static Node addTwoLists(Node num1, Node num2) {
        Node first = reverseList(num1);
        Node second = reverseList(num2);

        Node dummy = new Node(-1);
        Node temp = dummy;
        int carry = 0;

        while (first != null || second != null || carry == 1) {
            int sum = 0;

            if (first != null) {
                sum += first.data;
                first = first.next;
            }

            if (second != null) {
                sum += second.data;
                second = second.next;
            }

            sum += carry;
            carry = sum / 10;
            Node newNode = new Node(sum % 10);
            temp.next = newNode;
            temp = temp.next;
        }

        Node ans = reverseList(dummy.next);

        while (ans != null && ans.data == 0)
            ans = ans.next;

        return (ans == null) ? new Node(0) : ans;
    }

    static Node reverseList(Node head) {
        if (head == null || head.next == null)
            return head;

        Node prev = null;
        Node curr = head;
        Node next = null;

        while (curr != null) {
            next = curr.next;
            curr.next = prev;
            prev = curr;
            curr = next;
        }

        return prev;
    }
}
Advertisement
Was this solution helpful?