给你两个 非空 链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储一位数字。将这两数相加会返回一个新的链表。
你可以假设除了数字 0 之外,这两个数字都不会以零开头。
输入:l1 = [7,2,4,3], l2 = [5,6,4]
输出:[7,8,0,7]
示例2:
输入:l1 = [2,4,3], l2 = [5,6,4]
输出:[8,0,7]
示例3:
输入:l1 = [0], l2 = [0]
输出:[0]
**进阶:**如果输入链表不能翻转该如何解决?
如果不能将链表进行翻转。我们需要将链表转化,我们可以将链表转化成数字之后,进行相加,之后对相加之后的数字进行取链表化。
-
我们需要先将两个链表都转化为数字。
-
对转化过的两个数字进行相加。
-
对取和后的数字链表化
var addTwoNumbers = function (l1, l2) { let num1 = ""; let num2 = ""; while (l1) { num1 += l1.val; l1 = l1.next; } while (l2) { num2 += l2.val; l2 = l2.next; } let sum = (parseInt(num1) + parseInt(num2)).toString(); let head = new ListNode(1); let node = head for (let i = 0; i < sum.length; i++) { node.next = new ListNode(sum[i]) node = node.next } return head.next };
但是,在这种情况有一种弊端,当数字过大时,num1和num2会被科学计数,导致出现错误。所以数字相加并不能完美实现,所以我们需要通过另一种方法实现。利用栈,我们设置两个栈,将l1和l2的每个节点入栈,然后依次取出栈顶元素相加,将相加的个位数加入新的链表中,将十位数保存与下一次两个数相加的结果相加。
var addTwoNumbers = function (l1, l2) {
let stack1 = [];
let stack2 = [];
while (l1) {
stack1.push(l1.val)
l1 = l1.next;
}
while (l2) {
stack2.push(l2.val);
l2 = l2.next
}
let carry = 0;
let ansList = null;
while (stack1.length || stack2.length || carry !== 0) {//不断出栈
const s1 = stack1.length ? stack1.pop() : 0;
const s2 = stack2.length ? stack2.pop() : 0;
let val = s1 + s2 + carry;
carry = parseInt(val / 10);//计算进位
val = val % 10;//计算当前节点的值
const curNode = new ListNode(val);
curNode.next = ansList;//向链表前插入新节点
ansList = curNode;//重新赋值ansList
}
return ansList
};