https://leetcode-cn.com/problems/add-two-numbers-ii/
1 start from least significant bit, so start from last node of list.
2 scan both list from right to left.
3 general case, sum += l1.val + l2.val + carry
4 reverse result list so that most significant bit come first.
2 how to iterate input list from right to left?
as pointer is another direction, so reverse list.
this comes helper function.
[bug]
ListNode rev(ListNode head){
if(head.next==null){
return head;
}
ListNode sec = head.next;
ListNode ret = rev(sec);
sec.next = head;
head.next = null;
return ret;
}
[solution]
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode c1 = rev(l1);
ListNode c2 = rev(l2);
int carry = 0;
int sum = 0;
ListNode prev = new ListNode(-1);
ListNode cur = prev;
while(c1!=null || c2!=null || carry!=0){
sum = carry;
if(c1!=null){
sum += c1.val;
}
if(c2!=null){
sum += c2.val;
}
int val = sum%10;
carry = sum/10;
ListNode node = new ListNode(val);
cur.next = node;
cur = node;
if(c1!=null){
c1 = c1.next;
}
if(c2!=null){
c2 = c2.next;
}
}
return rev(prev.next);
}
ListNode rev(ListNode head){
if(head.next==null){
return head;
}
ListNode sec = head.next;
ListNode ret = rev(sec);
if(sec!=null){
sec.next = head;
head.next = null;
}
return ret;
}
}```