DDSA Solutions

Add 1 to a Linked List Number

Time: O(n)
Space: O(1)
Advertisement

Intuition

Add 1 to number stored in linked list. Reverse list, add 1 with carry, reverse back. Or recursively carry from end.

Algorithm

  1. 1Recursive: add 1 to last node. If sum >= 10: carry = 1, node.val = 0. Propagate carry back.
  2. 2If carry remains after head: insert new node with value 1 at front.

Common Pitfalls

  • Reverse-add-reverse is simpler iteratively. Recursive carry propagation is cleaner but uses O(n) stack.
Add 1 to a Linked List Number.java
Java
// Approach: Reverse the linked list, add 1 with carry propagation, then reverse again.
// Time: O(n) Space: O(1)
class Node {
    int data;
    Node next;

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

class Solution {
    public Node addOne(Node head) {
        Node num = reverse(head);
        Node rev = num;

        int sum = num.data + 1;
        int carry = sum / 10;
        num.data = sum % 10;

        while (carry > 0) {
            if (num.next == null)
                num.next = new Node(0);

            num = num.next;
            sum = num.data + carry;
            num.data = sum % 10;
            carry = sum / 10;
        }

        return reverse(rev);
    }

    Node reverse(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?