前端算法小白攻略31-leetcode(两数相加2)

361 阅读2分钟

「这是我参与2022首次更文挑战的第15天,活动详情查看:2022首次更文挑战

前言

两个链表的计算我们之前还没遇到过,今天这个两数相加就是我们将两个链表节点值的一个合并,然后生成一个新的链表,结合了链表操作和栈的相关运用。

题目描述

445. 两数相加 II

给你两个 非空 链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储一位数字。将这两数相加会返回一个新的链表。

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

来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/ad… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路

首先我们来说明一下题给示例:

image.png
我们有链表l1: 7->2->4->3; l2: 5->6->4;相加之后得到的新链表为7->8->0->7;从上图可以看出来,就是两个链表从末位的值开始相加,满10往上一位进1,其实就是7243+564 = 7807那么下面开始我们的解题步骤:

  1. 既然是两个链表值的相加,那我们首先得拿到两个链表节点的值,用栈给存起来
  2. 遍历两个栈的数字进行相加求解,这里我们需要注意的一点就是满10进1这一点,其实当前一位求和之后链表节点应该存储的值是sum % 10,而它的上一位需要加上进的位数。
  3. 有可能我们新的链表节点的个数比两个旧链表最长都长,那就说明,两个链表相加节点最高位满了10,往高位进了,所以我们要把这个进位数作为一个判断条件。

开始解题

var addTwoNumbers = function(l1, l2) {
    let stack1 = [], stack2 = [];
    let hair = new ListNode(-1);
    // 遍历两个链表,用栈来存链表节点的值
    while(l1) {             
        stack1.push(l1.val);
        l1 = l1.next;
    }

    while(l2) {
        stack2.push(l2.val);
        l2 = l2.next;
    }
    
    let ten = 0; // 满10进的位数
    while(stack1.length || stack2.length || ten) {
        let num1 = stack1[stack1.length-1] === undefined ? 0 : stack1.pop(),
        num2 = stack2[stack2.length-1] === undefined ? 0 : stack2.pop();  // 可能链表长度不一样,或者有最高位进位的关系,需要判断两个栈中的值
        let sum = num1 + num2 + ten;
        ten = Math.floor(sum / 10);
        let temp = new ListNode(sum%10, hair.next); // 新增的节点以老节点位头结点
        hair.next = temp; // 移动hair.next指向新节点,注意下这里是从后往前增加节点的,所以hair.next指向的每次都是指向新节点,把新节点作为链表的头节点
    }
    return hair.next; // 这里直接返回hair.next就是我们的新链表
};