力扣_两数相加

128 阅读2分钟

两数相加

要求

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

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

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

示例一:

addtwonumber1.jpg

输入: 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;
};