题目
给你两个 非空 链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储一位数字。将这两数相加会返回一个新的链表。
你可以假设除了数字 0 之外,这两个数字都不会以零开头。
示例1:
输入: l1 = [7,2,4,3], l2 = [5,6,4]
输出: [7,8,0,7]
输入: l1 = [2,4,3], l2 = [5,6,4]
输出: [8,0,7]
输入: l1 = [0], l2 = [0]
输出: [0]
解题思路
设定两个栈,将两个链表从头开始入栈,得到两个可以从尾部pop的数组栈;因为两数之和大于1要进位,设置进位step初始值为0,定义空节点来接收最终的结果; 开始循环,终止条件是两栈为空同时step 为0, 循环内将两数组栈pop出两个数与step相加,大于10 step 设为1 ,否则为0,当前值取余,最后将的到的值接入空节点形成链表
/**
* @param {ListNode} l1
* @param {ListNode} l2
* @return {ListNode}
*/
var addTwoNumbers = function(l1, l2) {
// 定义两个栈
let l1List = [];
let l2List = [];
// 将两个链表的值分别入栈
while(l1) {
l1List.push(l1.val);
l1 = l1.next;
}
while(l2) {
l2List.push(l2.val);
l2 = l2.next;
}
let vNode = null;
let step = 0; // 进位标识
while(l1List.length || l2List.length || step) {
// 取两栈的末尾值
let a = l1List.length ? l1List.pop() : 0;
let b = l2List.length ? l2List.pop() : 0;
let curr = a + b + step; // 要与进位相加的到结果
step = Math.floor(curr / 10); // 更新进位
curr = curr % 10; // 取当前值个位数
// 连接链表:总是将当前值至于链表首位,最后得到正确的顺序
let currNode = new ListNode(curr);
currNode.next = vNode;
vNode = currNode;
}
// 结果链表
return vNode;
};