2、两数相加 | JS-链表

给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。

请你将两个数相加,并以相同形式返回一个表示和的链表。

你可以假设除了数字 0 之外,这两个数都不会以 0 开头。

 

示例 1:

输入:l1 = [2,4,3], l2 = [5,6,4]
输出:[7,0,8]
解释:342 + 465 = 807


示例 2:

输入:l1 = [0], l2 = [0]
输出:[0]


示例 3:

输入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]
输出:[8,9,9,9,0,0,0,1]
 

提示:

每个链表中的节点数在范围 [1, 100] 内
0 <= Node.val <= 9
题目数据保证列表表示的数字不含前导零

 1 /**
 2  * Definition for singly-linked list.
 3  * function ListNode(val, next) {
 4  *     this.val = (val===undefined ? 0 : val)
 5  *     this.next = (next===undefined ? null : next)
 6  * }
 7  */
 8 /**
 9  * @param {ListNode} l1
10  * @param {ListNode} l2
11  * @return {ListNode}
12  */
13 var addTwoNumbers = function(l1, l2) {
14     const l3 = new ListNode(0);  //相当于两个数从个位开始相加,链表从左往右存储的就是个位、十位、百位...
15     let p1 = l1;
16     let p2 = l2;
17     let p3 = l3;
18     let carry = 0;  //如果相加大于10了,十位上的数
19     while(p1 || p2){
20         const v1 = p1 ? p1.val : 0; //如果两个链表一长一短,短的那个走完了就设为0
21         const v2 = p2 ? p2.val : 0;
22         const val = v1 + v2 + carry; //如果前两个数字相加大于10了,所进的哪一位
23         carry = Math.floor(val / 10);
24         p3.next = new ListNode(val % 10);
25         if(p1) p1 = p1.next; //链表后面如果还有值,就向后移动
26         if(p2) p2 = p2.next;
27         p3 = p3.next;
28     }
29     if(carry) {
30         p3.next = new ListNode(carry);  //如果到最后遍历完链表了,carry值不为0,说明还需要向后进一位
31     }
32     return l3.next; //l3一开始存的是参数为0的头结点,后面才是需要返回的结果
33 };
原文地址:https://www.cnblogs.com/oaoa/p/14825355.html