【前端也得会算法】2. 两数相加 [ 中等 ]

137 阅读1分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

一、题目描述:

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

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

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

示例

示例 1:
输入: l1 = [2,4,3], l2 = [5,6,4]
输出: [7,0,8]
解释: 342 + 465 = 807.

image.png

示例 2:
输入: l1 = [0], l2 = [0]
输出: [0]


示例 3:
输入: 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
  • 题目数据保证列表表示的数字不含前导零

二、题解:

方法一 遍历进位法

  • 原理。遍历链表同时,构造输出链表,记录进位即可。
  • 思路。
    • 获取两个链表此时指针对应的值
    • 获取两数以及进位的数之和
    • 判断是否需要进位
    • 为输出链表构造,并开始遍历
      • res 作为记录
      • head 作为遍历的指针
    • l1和l2取next
  • 注意。
    • 链表末端是null,注意边界问题
    • 存在add为1,但是链表遍历完了的情况,所以while循环多加了判断

代码:

var addTwoNumbers = function(l1, l2) {
    let res = null,
        head = null,
        add = 0,
        num1 = 0,
        num2 = 0,
        sum = 0
    while(l1 || l2 || add){
        num1 = l1?l1.val:0
        num2 = l2?l2.val:0
        sum = num1+num2+add
        add = sum >9 ?1:0
        if(!res){
           head = res = new ListNode(sum%10,null)
        } else{
           head = head.next = new ListNode(sum%10,null)
        }
        l1 = l1?l1.next:null
        l2 = l2?l2.next:null
    }
    
    return res
};

image.png

三、总结

  • 此题可以遍历进位法
  • 遍历进位法主要是遍历链表同时,构造输出链表,记录进位即可。

文中如有错误,欢迎在评论区指正