Iterative solution

public class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        ListNode dummyNode = new ListNode(0);
        dummyNode.next = l1;

        ListNode prev = dummyNode;
        int carry = 0;

        while (l1 != null && l2 != null) {
            int num = l1.val + l2.val + carry;
            System.out.println(num);
            l1.val = num > 9 ? (num - 10) : num;
            carry = num > 9 ? 1 : 0;

            prev = l1;
            l1 = l1.next;
            l2 = l2.next;
        }

        while (l1 != null) {
            int num = l1.val + carry;

            l1.val = num > 9 ? (num - 10) : num;
            carry = num > 9 ? 1 : 0;

            prev = l1;
            l1 = l1.next;
        }

        while (l2 != null) {
            int num = l2.val + carry;

            l2.val = num > 9 ? (num - 10) : num;
            carry = num > 9 ? 1 : 0;

            prev.next = l2;
            prev = prev.next;
            l2 = l2.next;
        }

        if (carry != 0) {
            prev.next = new ListNode(carry);
        }

        return dummyNode.next;
    }
}

Recursive

this one is faster

public class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        return helper(l1, l2, 0);
    }

    private ListNode helper(ListNode l1, ListNode l2, int carry) {
        if (l1 == null && l2 == null & carry == 0) return null;

        int num = (l1 == null ? 0 : l1.val) + (l2 == null ? 0 : l2.val) + carry;

        carry = num / 10;
        int digit = num % 10;

        ListNode node = new ListNode(digit);
        node.next = helper(l1 == null ? null : l1.next, l2 == null ? null : l2.next, carry);

        return node;
    }
}

results matching ""

    No results matching ""