var addTwoNumbers = function(l1, l2) {
let val1 = 0;
let val2 = 0;
let l1NowNode = l1;
let l2NowNode = l2;
while (l1NowNode && l2NowNode) {
val1 = val1 * 10 + l1NowNode.val;
val2 = val2 * 10 + l2NowNode.val;
l1NowNode = l1NowNode.next;
l2NowNode = l2NowNode.next;
}
let extraVal = l1NowNode ? val1 : val2;
let extraNowNode = l1NowNode || l2NowNode;
while (extraNowNode) {
extraVal = extraVal * 10 + extraNowNode.val;
extraNowNode = extraNowNode.next;
}
if (l1NowNode) {
val1 = extraVal;
} else {
val2 = extraVal;
}
/* 至此计算出两个链表代表的数字 */
const sum = val1 + val2;
const stack = [];
if (sum === 0) {
return new ListNode(0);
}
let nowSum = sum;
while (nowSum) {
stack.push(nowSum % 10);
nowSum = Math.floor(nowSum / 10);
}
const resList = new ListNode(0);
let nowResNode = resList;
while (stack.length) {
const nowVal = stack.pop();
const newResNode = new ListNode(nowVal);
nowResNode.next = newResNode;
nowResNode = nowResNode.next;
}
return resList.next;
};
代码如上,将大象拆解的过程是这样的
1.根据传入的两个链表计算出他们对应的数字;
2.两者相加得到结果链表的数字;
3.将结果数字各位放在一个栈中;
4.利用该栈不断新生成结果节点。
然而,在No.1561 case中,是传入两个超长链表(也就是说是两个超大数字相加),大家都知道js的数字精度在两个超大数字相加是极容易丢失的,所以我们只能通过字符串的形式相加得到数字字符串。
利用leetcode 415题addStrings
// 将两个字符串数字相加返回
declare function addStrings(num1: string, num2: string) : string
var addTwoNumbers = function(l1, l2) {
// 改动点
let val1 = '';
let val2 = '';
let l1NowNode = l1;
let l2NowNode = l2;
while (l1NowNode && l2NowNode) {
// 改动点
val1 = val1 + l1NowNode.val;
val2 = val2 + l2NowNode.val;
l1NowNode = l1NowNode.next;
l2NowNode = l2NowNode.next;
}
let extraVal = l1NowNode ? val1 : val2;
let extraNowNode = l1NowNode || l2NowNode;
while (extraNowNode) {
// 改动点
extraVal = extraVal + extraNowNode.val;
extraNowNode = extraNowNode.next;
}
if (l1NowNode) {
val1 = extraVal;
} else {
val2 = extraVal;
}
/* 至此计算出两个链表代表的数字字符串 */
const sumStr = addStrings(val1, val2);
if (sumStr === '0') {
return new ListNode(0);
}
let nowSumStr = sumStr;
const resList = new ListNode(0);
let nowResNode = resList;
while (nowSumStr) {
const nowVal = nowSumStr[0];
const newResNode = new ListNode(Number(nowVal));
nowResNode.next = newResNode;
nowResNode = nowResNode.next;
nowSumStr = nowSumStr.slice(1);
}
return resList.next;
};