题干
给你两个 非空 链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储一位数字。将这两数相加会返回一个新的链表。
你可以假设除了数字 0 之外,这两个数字都不会以零开头。
进阶:
如果输入链表不能修改该如何处理?换句话说,你不能对列表中的节点进行翻转。
示例:
输入:(7 -> 2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 8 -> 0 -> 7
来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/ad… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解法:栈
这道题与两数相加的区别是,两数相加为我们进行了数字的逆序,所以我们直接就可以操作链表来进行类似的竖式运算,我们只需要处理计算的逻辑即可。而这道题就是给了我们数据的初始,所以我们应该将他们转换为可以计算的形式,这时我们就要想到另外的一种数据结构——栈,我们依次将两个链表的数据压入栈中,再依次计算栈顶元素,这时我们就可以得到我们想要的结果。
还有一点需要注意的是,我们依次计算的结果的顺序是从后到前的,所以我们不能按照常规的存入链表方式来将得到的结果值存入,而是要使用头插法,使每次插入的节点都跟在head的next节点上。这样就保证了我们结果的顺序。
代码实现:
/**
* 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) {
let stack1 = [];
let stack2 = [];
while (l1 != null) {
stack1.push(l1.val);
l1 = l1.next;
}
while (l2 != null) {
stack2.push(l2.val);
l2 = l2.next;
}
let newListNode = new ListNode(0);
let current = newListNode;
let yu = 0;
let zhi = 0;
while (stack1.length > 0 && stack2.length > 0) {
let stack1data = stack1.pop();
let stack2data = stack2.pop();
zhi = (stack1data + stack2data + yu) % 10;
headInsertToList(current, zhi)
yu = Math.floor((stack1data + stack2data + yu) / 10);
}
if (stack1.length != 0) {
while (stack1.length != 0) {
let stack1data = stack1.pop();
zhi = (stack1data + yu) % 10;
headInsertToList(current, zhi)
yu = Math.floor((stack1data + yu) / 10);
}
}
if (stack2.length != 0) {
while (stack2.length != 0) {
let stack2data = stack2.pop();
zhi = (stack2data + yu) % 10;
headInsertToList(current, zhi)
yu = Math.floor((stack2data + yu) / 10);
}
}
if (yu != 0) {
headInsertToList(current, yu)
}
return newListNode.next
};
function headInsertToList(current, zhi) {
let newNode = new ListNode(zhi)
newNode.next = current.next;
current.next = newNode
}