DFS
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
public class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
int len1 = getLength(l1);
int len2 = getLength(l2);
int offset = Math.abs(len1 - len2);
ListNode head = len1 > len2 ? helper(l1, l2, offset) : helper(l2, l1, offset);
if (head != null && head.val >= 10) {
ListNode headhead = new ListNode(head.val / 10);
headhead.next = head;
head.val = head.val % 10;
return headhead;
}
return head;
}
private ListNode helper(ListNode l1, ListNode l2, int offset) {
if (l1 == null && l2 == null) return null;
ListNode node = offset > 0 ? l1 : new ListNode(l1.val + l2.val);
ListNode next = offset > 0 ? helper(l1.next, l2, offset - 1) : helper(l1.next, l2.next, 0);
int carry = 0;
if (next != null && next.val >= 10) {
carry = next.val / 10;
next.val = next.val % 10;
}
node.val = node.val + carry;
node.next = next;
return node;
}
private int getLength(ListNode node) {
int len = 0;
while (node != null) {
len++;
node = node.next;
}
return len;
}
}
Stack
public class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
Stack<ListNode> s1 = new Stack<>();
Stack<ListNode> s2 = new Stack<>();
while (l1 != null) {
s1.push(l1);
l1 = l1.next;
}
while (l2 != null) {
s2.push(l2);
l2 = l2.next;
}
int carry = 0;
ListNode dummyNode = new ListNode(0);
while (!s1.isEmpty() || !s2.isEmpty()) {
ListNode node = new ListNode((s1.isEmpty() ? 0 : s1.pop().val) + (s2.isEmpty() ? 0 : s2.pop().val) + carry);
carry = node.val / 10;
node.val = node.val % 10;
node.next = dummyNode.next;
dummyNode.next = node;
}
if (carry != 0) {
ListNode node = new ListNode(carry);
node.next = dummyNode.next;
dummyNode.next = node;
}
return dummyNode.next;
}
}