【路飞】算法与数据结构-两数相加 II 

167 阅读1分钟

LeetCode:地址

题目要求

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

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

示例 1:

1626420025-fZfzMX-image.png

输入: l1 = [7,2,4,3], l2 = [5,6,4]
输出: [7,8,0,7]

示例 2:

输入: l1 = [2,4,3], l2 = [5,6,4]
输出: [8,0,7]

示例 3:

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

提示:

  • 链表的长度范围为 [1, 100]
  • 0 <= node.val <= 9
  • 输入数据保证链表代表的数字无前导 0
思路

思路:将两个链表的节点都推入栈中,然后不断出栈,计算每个位置的值和进位,串连成一个新的链表 复杂度:时间复杂度O(max(m,n)),m,n是两个链表的长度,空间复杂度O(m+n)

代码
var addTwoNumbers = function(l1, l2) {
    const stack1 = [];
    const stack2 = [];
    while (l1 || l2) {//两链表入栈
        if (l1) {
            stack1.push(l1.val);
            l1 = l1.next;
        }
        if (l2) {
            stack2.push(l2.val);
            l2 = l2.next;
        }
    }
    let carry = 0;
    let ansList = null;
    while (stack1.length || stack2.length || carry !== 0) {//不断出栈
        const s1 = stack1.length ? stack1.pop() : 0;
        const s2 = stack2.length ? stack2.pop() : 0;
        let val = s1 + s2 + carry;
        carry = parseInt(val / 10);//计算进位
        val = val % 10;//计算当前节点的值
        const curNode = new ListNode(val);
        curNode.next = ansList;//向链表前插入新节点
        ansList = curNode;//重新赋值ansList
    }
    return ansList;
};