/**
* Definition for ListNode
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
public class Solution {
/**
* @param l1: The first list.
* @param l2: The second list.
* @return: the sum list of l1 and l2.
*/
public ListNode addLists2(ListNode l1, ListNode l2) {
// write your code here
if(l1 == null) return l2;
if(l2 == null) return l1;
ListNode newL1 = reverse(l1);
ListNode newL2 = reverse(l2);
ListNode sum = sumList(newL1, newL2);
return reverse(sum);
}
public ListNode reverse(ListNode node) {
if(node == null || node.next == null) return node;
ListNode f = null, s = node, t = node.next;
while(t != null) {
s.next = f;
f = s;
s = t;
t = t.next;
}
s.next = f;
return s;
}
public ListNode sumList(ListNode n1, ListNode n2) {
ListNode node = new ListNode(0);
ListNode result = node;
int sum, mod;
int index = 0;
while(n1 != null || n2 != null) {
if(n1 != null && n2 != null) {
sum = n1.val + n2.val + index;
} else if(n1 != null && n2 == null) {
sum = n1.val + index;
} else {
sum = n2.val + index;
}
mod = sum % 10;
node.next = new ListNode(mod);
node = node.next;
index = sum / 10;
n1 = n1 == null ? n1 : n1.next;
n2 = n2 == null ? n2 : n2.next;
}
if(index == 1) {
node.next = new ListNode(index);
}
return result.next;
}
}