You are given two linked lists representing two non-negative numbers. The digits are stored in reverse order and each of their nodes contain a single digit. Add the two numbers and return it as a linked list.

Input: (2 -> 4 -> 3) + (5 -> 6 -> 4)
Output: 7 -> 0 -> 8

public class Add2Numbers {
public ListNode add2Numbers(ListNode l1, ListNode l2){
ListNode p = new ListNode(0);
ListNode store = null;
if(l1==null||l2==null){//判断是否有空节点
if(l2!=null){
store = l2;
}
if(l1!=null){
store = l1;
}
return store;
}
store = p;//store存储头节点
int sum = l1.val+l2.val;
int c = sum/10;//c为进位数
store.val = sum%10;
l1 = l1.next;
l2 = l2.next;
while(l1!=null || l2!=null){
p.next = new ListNode(0);
p=p.next;
if(l1==null){
sum = l2.val+c;
l2=l2.next;
}else if(l2==null){
sum = l1.val+c;
l1=l1.next;
}else{
sum = l1.val + l2.val+c;
l1=l1.next;
l2=l2.next;
}
if(sum>9){
p.val=sum%10;
c = sum/10;
}else{
c=0;
p.val = sum;
}
}
if(c!=0){
p.next = new ListNode(c);
}
return store;
}

Run Status: Accepted!
Program Runtime: 588 milli secs
Progress: 33/33 test cases passed.
Run Status: Accepted!
Program Runtime: 812 milli secs
Progress: 1555/1555 test cases passed.

public ListNode add2Numbers(ListNode l1, ListNode l2){
ListNode store = null;
if(l1==null||l2==null){
if(l2!=null){
store = l2;
}
if(l1!=null){
store = l1;
}
return store;
}
ListNode p = new ListNode(0);
store = p;
int sum = l1.val+l2.val;
int c = sum/10;
if(c==1){//取余和减法哪个耗能？
store.val = sum-10;
}else{
store.val = sum;
}
l1 = l1.next;
l2 = l2.next;
while(l1!=null || l2!=null){
if(l1==null){
if(c==0){//无进位时没必要计算，直接嫁接链表
p.next=l2;
break;
}
sum = l2.val+c;//有必要用c么？
l2=l2.next;
}else if(l2==null){
if(c==0){
p.next=l1;
break;
}
sum = l1.val+c;
l1=l1.next;
}else{
sum = l1.val + l2.val + c;
l1=l1.next;
l2=l2.next;
}
if(sum>9){
p.next=new ListNode(sum-10);
c = 1;
}else{
c=0;
p.next = new ListNode(sum);
}
p=p.next;
}
if(c!=0){
p.next = new ListNode(c);
}
return store;
}