第一种:先反转链表,计算和,再将计算后的结果进行反转
const reverseListNode = (head) => {
if(!head || !head.next) {
return head;
}
let cur = head;
let next = cur.next;
cur.next = null;
while(next) {
let tmp = next.next;
next.next = cur;
cur = next;
next = tmp;
}
return cur;
}
const addTwoNumbers = (l1, l2) => {
let reverseL1 = reverseListNode(l1);
let reverseL2 = reverseListNode(l2);
let result = new ListNode(-1);
let res = result;
let count = 0;
while(reverseL1 || reverseL2 || count) {
let val1 = reverseL1 ? reverseL1.val : 0;
let val2 = reverseL2 ? reverseL2.val : 0;
const sum = count + val1 + val2;
let tmp = sum % 10;
count = sum >= 10 ? 1 : 0;
result.next = new ListNode(tmp);
result = result.next;
if(reverseL1) {
reverseL1 = reverseL1.next;
}
if(reverseL2) {
reverseL2 = reverseL2.next;
}
}
return reverseListNode(res.next);
}
第二种:使用栈
const addTwoNumbers = (l1, l2) => {
const stack1 = [];
const stack2 = [];
while(l1){
stack1.push(l1.val);
l1 = l1.next;
}
while(l2){
stack2.push(l2.val);
l2 = l2.next;
}
let prev = null;
let carry = 0;
while(stack1.length || stack2.length || carry) {
const val1 = stack1.length ? stack1.pop() : 0;
const val2 = stack2.length ? stack2.pop() : 0;
const sum = val1 + val2 + carry;
carry = parseInt(sum / 10);
const cur = new ListNode(sum % 10);
cur.next = prev;
prev = cur;
}
return prev;
}
来源
445. 两数相加 II