[路飞]_445. 两数相加 II

114 阅读1分钟

题目介绍

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

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

 

示例1:

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

进阶:如果输入链表不能翻转该如何解决?

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

解题思路

用栈来实现

  • 遍历两个遍历分别入栈, s1,s2
  • 判断s1,s2是否有元素,有元素就进入循环,栈顶部数组相加还有加上上一次相加的进位数取 10的余数,这就是当前节点的值,并且要记录当前数的进位数
  • 如果s1,s2都没有元素了,最后判断进位数是否大于0如果是,还要进入循环一次,把进位数的节点补上

代码

/**
 * 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 s1 = []
    let s2 = []
    while(l1 || l2) {
        if (l1) {
            s1.push(l1)
            l1 = l1.next
        }
        if (l2) {
            s2.push(l2)
            l2 = l2.next
        }
    }
    let pre = 0
    let newHead = null
    while(s1.length || s2.length || pre > 0) {
        let s1Val = s1.length ? s1.pop().val : 0
        let s2Val = s2.length ? s2.pop().val : 0
        let newVal = s1Val + s2Val + pre
        pre = parseInt(newVal / 10) 
        let node = new ListNode(newVal % 10)
        node.next = newHead
        newHead = node
    }
    return newHead
};