LeetCode solution. For this problem, the major issue for most people would be forgetting to handle the last carry on value.
Here I provide two solutions. First one is a recursive version, the second one is iterative version.
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
if(l1 == null) return l1;
if(l2 == null) return l2;
return addTwoNumbers(l1,l2,0);
}
public ListNode addTwoNumbers(ListNode l1, ListNode l2, int carryOn){
if(l1 == null&&l2!=null){
ListNode l3 = new ListNode((carryOn+l2.val)%10);
l3.next = addTwoNumbers(l1, l2.next,(carryOn+l2.val)/10);
return l3;
}else if(l1!=null &&l2==null){
ListNode l3 = new ListNode((carryOn+l1.val)%10);
l3.next = addTwoNumbers(l1.next, l2,(carryOn+l1.val)/10);
return l3;
}else if(l1 !=null && l2!=null){
ListNode l3 = new ListNode((carryOn+l1.val+l2.val)%10);
l3.next = addTwoNumbers(l1.next, l2.next,(carryOn+l1.val+l2.val)/10);
return l3;
}else{
if(carryOn == 0) return null;
ListNode l3 = new ListNode(carryOn);
return l3;
}
}
###the iterative version
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
int carryOn =0;
ListNode result=null;
ListNode curNode=null;
if(l1 == null) return l2;
if(l2 == null) return l1;
ListNode l1Head = l1;
ListNode l2Head = l2;
while(l1Head!=null && l2Head!=null){
ListNode newNode = new ListNode((l1Head.val+l2Head.val+carryOn)%10);
carryOn = ((l1Head.val+l2Head.val+carryOn))/10;
if(result ==null){
result =newNode;
curNode=newNode;
}else{
curNode.next=newNode;
curNode = newNode;
}
l1Head = l1Head.next;
l2Head = l2Head.next;
}
while(l2Head !=null){
ListNode newNode = new ListNode((carryOn+l2Head.val)%10);
carryOn=(carryOn+l2Head.val)/10;
curNode.next=newNode;
curNode =newNode;
l2Head=l2Head.next;
}
while(l1Head !=null){
ListNode newNode = new ListNode((carryOn+l1Head.val)%10);
carryOn=(carryOn+l1Head.val)/10;
curNode.next=newNode;
curNode =newNode;
l1Head = l1Head.next;
}
if(carryOn!=0){
ListNode newNode = new ListNode(carryOn);
curNode.next=newNode;
}
return result;
}
The second code is a little bit longer. Happy to discuss!