中文:leetcode-cn.com/problems/ad…
题目描述
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
题解

首先每一位相加肯定会产生进位,我们用 carry 表示。进位最大会是 1 ,因为最大的情况是无非是 9 + 9 + 1 = 19 ,也就是两个最大的数相加,再加进位,这样最大是 19 ,不会产生进位 2 。
/**
* Definition for singly-linked list.
* function ListNode(val) {
* this.val = val;
* this.next = null;
* }
*/
/**
* @param {ListNode} l1
* @param {ListNode} l2
* @return {ListNode}
*/
var addTwoNumbers = function(l1, l2) {
// 给 p 和 q 分别赋值为给定的两个链表 l1 和 l2 的头,也就是个位
let p = l1
let q = l2
// 初始化进位 carry 为 0
let carry = 0
// 初始化一个节点的头,dummy head ,但是这个头不存储数字。并且将 curr 指向它
const dummyHead = new ListNode()
let curr = dummyHead
// 循环,直到 p 和 q 全部为 null,退出循环
while (p || q) {
// 设置 x 为 p 节点的值,如果 p 是 null,设置 x 为 0
// 设置 y 为 q 节点的值,如果 q 是 null,设置 y 为 0
const x = p ? p.val : 0
const y = q ? q.val : 0
// 设置 sum = x + y + carry
const sum = x + y + carry
// 更新 carry = sum / 10
carry = Math.floor(sum / 10)
// 创建一个值为 sum 模 10 的节点,并将 curr 的 next 指向它,同时 curr 指向变为当前的新节点
curr.next = new ListNode(sum % 10);
curr = curr.next;
// 向前移动 p 和 q
if (p) p = p.next
if (q) q = q.next
}
// 判断 carry 是否等于 1 ,如果等于 1 ,在链表末尾增加一个为 1 的节点
if (carry > 0) {
curr.next = new ListNode(carry);
}
// 返回 dummy head 的 next ,也就是个位数开始的地方
return dummyHead.next
};
function ListNode(val) {
this.val = val;
this.next = null;
}
// [2,4,3]
// [5,6,4]
let l1 = new ListNode(2)
l1.next = new ListNode(4)
l1.next.next = new ListNode(3)
l1.next.next.next = null
let l2 = new ListNode(5)
l2.next = new ListNode(6)
l2.next.next = new ListNode(4)
l2.next.next.next = null
console.log(addTwoNumbers(l1, l2))