橙晨燕

vuePress-theme-reco Visionwuwu    2020 - 2021
橙晨燕 橙晨燕

Choose mode

  • dark
  • auto
  • light
主页
分类
  • 大学课程
  • 前端
  • 力扣算法
  • 随笔
标签
时间线
收藏集
  • 爱看的书
  • 爱追的剧
其他
  • 每日壹题 📚
  • CET-4 🛰️
  • 技术文档 📖
  • 收藏文章 📮
  • 项目展示 🚀
  • 项目总结 📝
  • 工具箱 📦

    • 图片压缩
    • 阿里云
    • 腾讯云
    • 掘金
    • CSDN
关于我
GitHub
author-avatar

Visionwuwu

25

文章

8

标签

主页
分类
  • 大学课程
  • 前端
  • 力扣算法
  • 随笔
标签
时间线
收藏集
  • 爱看的书
  • 爱追的剧
其他
  • 每日壹题 📚
  • CET-4 🛰️
  • 技术文档 📖
  • 收藏文章 📮
  • 项目展示 🚀
  • 项目总结 📝
  • 工具箱 📦

    • 图片压缩
    • 阿里云
    • 腾讯云
    • 掘金
    • CSDN
关于我
GitHub
  • 每日壹题
  • 2021年1月

    • 「No.01」【 每日壹题 】
    • 「No.02」【 每日壹题 】
      • LeetCode算法题之-俩数相加
        • 示例
        • 思路
        • 参考答案
    • 「No.03」【 每日壹题 】
    • 「No.04」【 每日壹题 】

「No.02」【 每日壹题 】

vuePress-theme-reco Visionwuwu    2020 - 2021

「No.02」【 每日壹题 】


Visionwuwu 2021-01-24 算法 javascript

  • LeetCode算法题之-俩数相加
    • 示例
    • 思路
    • 参考答案

LeetCode算法题之-俩数相加

# LeetCode算法题之-俩数相加

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

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

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

# 示例

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

# 思路

  1. 创建一个新的节点作为链表头,将dummy指向当前节点
  2. 定义一个临时变量curr指向dummy
  3. 定义一个变量carry用来表示俩数相加是否需要进位 0 表示不进位 1表示进位
  4. 当l1或l2存在时需要循环遍历,拿到链表的每个节点的值相加,
  5. l1或l2的存在就取对应节点的值相加,还需加上当前进位数,得到相加结果sum
  6. 判断是否需要进位,第一种如果sum >= 10需要进位,第二种carry = Math.floor(sum / 10)
  7. 每个节点只能存放一位数所以,需要取sum的个位数存放到新的节点,有俩种方式: 第一种sum - 10,第二种sum % 10
  8. 将curr向前进一位指向新的节点
  9. l1和l2向后移一位指向下一个节点
  10. 当俩个链表到头了,需要在检查一下carry如果是1需要附加一个节点把1存放进去
  11. 最后在返回dummy.next,也就是最后链表的头

# 参考答案

详细信息
/**
 * 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 dummy = new ListNode('head')
    let curr = dummy
    let carry = 0
    while (l1 !== null || l2 !== null) {
        let sum = (l1 ? l1.val : 0) + (l2 ? l2.val : 0) + carry
        // 判断是否需要进位
        // carry = sum >= 10 ? 1: 0
        carry = Math.floor(sum / 10)
        // 创建一个新的节点,给当前节点赋值,并贴到curr的后面
        // curr.next = new ListNode(sum - 10)
        curr.next = new ListNode(sum % 10)
        // 将curr移动到下一位,以便贴下一个节点
        curr = curr.next
        // 判断l1和l2是否存在,进一位获取下个节点
        l1 && (l1 = l1.next)
        l2 && (l2 = l2.next)
    }
    // 最后检查是否需要进位,附加一个节点到curr的后面
    carry && (curr.next = new ListNode(carry))
    // 返回dummy.next,就是这个链表的头节点
    return dummy.next
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
在 GitHub 上编辑此页 !
最后一次更新: 4 个月前