两数相加
要求
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例一:
输入: l1 = [2,4,3], l2 = [5,6,4]
输出: [7,0,8]
解释: 342 + 465 = 807.
示例二:
输入: l1 = [0], l2 = [0]
输出: [0]
示例三:
输入: 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- 题目数据保证列表表示的数字不含前导零
思路
传入两个长度未知的链表,两个链表的指针.val相加的值是新链表的值,超过十,%10之后加到指针.next.val的值上,所以我们需要创建两个指针,一个链表(用来返回),以及一个用来储存两个val相加的值的变量
let carry = 0,//存和的变量
head = null,//新的链表头
tail = null;//操作链表的指针
head = tail = new ListNode();
创建好之后,把传进来的两个链表先判断是否为null,为null就赋值0,不为null就让它们的val相加,放到新链表的val上,若超过10,则存起来,用来进行下一轮的赋值
/**
* 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 carry = 0,//存和的变量
head = null,//新的链表头
tail = null;//操作链表的指针
while (l1 || l2) {//必须要有一个链表不为null
//获取指针所指的链表的节点的值
let n1 = l1 ? l1.val : 0;
let n2 = l2 ? l2.val : 0;
//获取总值,若上一个节点的值超过10,则carry有值:Math.floor((sum) / 10)
let sum = n1 + n2 + carry;
if (!head) {//第一次进来,创建新链表,用来返回
head = tail = new ListNode(sum % 10);
} else {//赋值到当前节点,tail指针往后移动
tail.next = new ListNode(sum % 10);
tail = tail.next;
}
carry = Math.floor((sum) / 10);
//传进来的链表的指针往后移动
if (l1) l1 = l1.next;
if (l2) l2 = l2.next;
}
若计算到最后一步,得到的值大于等于10,则再创建一个节点存值,链到我们需要返回的链表上。
if (carry > 0) tail.next = new ListNode(carry);
return head;
};