method: linked list
1 prepare a dummy node
2 prepare a carry for num >= 10
3 iterate through l1 and l2
4 if there is still l1 or l2, iterate it
5 check if carry == 1 or not
6 output dummy.next
Python:
class Solution:
def addTwoNumbers(self, l1: Optional[ListNode], l2: Optional[ListNode]) -> Optional[ListNode]:
# This is the final code, it is neat and concise
p = dummy = ListNode(0)
carry = 0
while l1 or l2:
if l1 and l2:
val = l1.val + l2.val + carry
elif l1:
val = l1.val + carry
else:
val = l2.val + carry
p.next = ListNode(val % 10)
p = p.next
if l1: l1 = l1.next
if l2: l2 = l2.next
carry = val // 10
if carry == 1:
p.next = ListNode(1)
return dummy.next
JS:
/**
* Definition for singly-linked list.
* function ListNode(val, next) {
* this.val = (val===undefined ? 0 : val)
* this.next = (next===undefined ? null : next)
* }
*/
/**
* @param {ListNode} l1
* @param {ListNode} l2
* @return {ListNode}
*/
var addTwoNumbers = function(l1, l2) {
const dummy = new ListNode();
let p = dummy;
let carry = 0;
while (l1 || l2) {
const val = (l1 ? l1.val : 0) + (l2 ? l2.val : 0) + carry;
p.next = ne
w ListNode(val % 10);
p = p.next;
if (l1) l1 = l1.next;
if (l2) l2 = l2.next;
carry = parseInt(val / 10);
}
if (carry) p.next = new ListNode(1);
return dummy.next
};