LeetCode题解——两数相加

1、题目描述

给出两个非空链表用来表示两个非负的整数。其中,它们各自的位数是按照逆序的方式存储的,并且它们的每个节点只能存储一位数字。

如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和

示例:

js 复制代码
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807

2、解题思路

这是一个链表操作的题目,我们可以遍历两个链表,将每个节点依次相加。得到相加的结果之后,将个位数作为当前位的结果,如有十位,就将十位进到下一次进行相加,这样就得出的最后的结果。

3、代码实现

js 复制代码
/**
 * Definition for singly-linked list.
 * function ListNode(val) {
 *   this.val = val;
 *   this.next = null;
 * }
 */
/**
 * @param {ListNode} l1
 * @param {ListNode} l2
 * @return {ListNode}
 */
var addTwoNumbers = function(l1, l2) {
  const l3 = new ListNode(0) // 用来保存结果的链表
  let p1 = l1 // 定义两个指针,来遍历链表
  let p2 = l2
  let p3 = l3 // 定义两个指针,指向结果链表
  let carry = 0 // 记录每次相加之后的进位的值
  while(p1 || p2) {
    const v1 = p1 ? p1.val : 0
    const v2 = p2 ? p2.val : 0
    const val = v1 + v2 + carry //
    carry = Math.floor(val / 10) // 计算进位的值
    p3.next = new ListNode(val % 10) // 将个位的值作为当前位的结果
    if(p1) p1 = p1.next // 将指针指向下一个节点
    if(p2) p2 = p2.next
    p3 = p3.next
  }
  // 如果最后还有进位的值,直接放在结果链表
  if (carry) {
    p3.next = new ListNode(carry)
  }
  return l3.next
}

解释:

输入:

js 复制代码
l1: 2 -> 4 -> 3 -> null (表示数字342)
l2: 5 -> 6 -> 4 -> null  (表示数字465)

执行过程:

1、初始化
- l3: 0 -> null
- carry = 0

2、第一次循环(个位):
- v1 = 2, v2 = 5
- val = 2 + 5 + 0 = 7
- carry = 7 // 10 = 0
- l3: 0 -> 7 -> null
- 移动指针:p1指向4,p2指向6

3、第二次循环(十位):
- v1 = 4, v2 = 6
- val = 4 + 6 + 0 = 10
- carry = 10 // 10 = 1
- l3: 0 -> 7 -> 0 -> null (因为 10 % 10 = 0)
- 移动指针:p1指向3,p2指向4

4、第三次循环(百位)
- v1 = 3, v2 = 4
- val = 3 + 4 + 1 = 8 (注意这里加了进位1)
- carry = 8 // 10 = 0
- l3: 0 -> 7 -> 0 -> 8 -> null
- 移动指针: p1和p2均为null,退出循环

5、最终结果;
- 返回l3.next:7 -> 0 -> 8 -> null (表示807)

  • 创建一个虚拟头节点l3(值为0),最终返回l3.next
  • carry记录进位值。
  • 当链表长度不一致时,短链表用0补位。
  • 循环结束后如果还有进位,需要额外添加节点。

假设有两个链表:

js 复制代码
- l1: 2->4->3(表示数字342)
- l2: 5->6->4(表示数字465)

执行过程图示:

js 复制代码
初始化:
l3:0 -> null
carry = 0

Step 1(个位相加):
2 + 5 + 0 = 7
carry = 0
l3: 0 -> 7 -> null

Step 2(十位相加):
4 + 6 + 0 = 10
carry = 1
l3: 0 -> 7 -> 0 -> null

Step 3(百位相加):
3 + 4 + 1 = 8
carry = 0
l3: 0 -> 7 -> 0 -> 8 -> null

最终结果:7 -> 0 -> 8 (表示807)

js 复制代码
- l1: 2->4->3(表示数字342)
- l2: 5->6->4(表示数字465)
js 复制代码
l1: 2 -> 4 -> 3 -> null
l2: 5 -> 6 -> 4 -> null
l3: 0 -> null

第一次循环后:
l3: 0 -> 7 -> null

第二次循环后:
l3: 0 -> 7 -> 0 -> null

第三次循环后:
l3: 0 -> 7 -> 0 -> 8 -> null

返回 l3.next: 7 -> 0 -> 8 -> null

4、提交结果

相关推荐
爱吃甜品的糯米团子9 分钟前
CSS图片背景属性
前端·css
雮尘15 分钟前
一文读懂Android Fragment栈管理
android·前端
Aoda19 分钟前
浏览器字体设置引发的Bug:从一次调查到前端字体策略的深度思考
前端·css
朝与暮21 分钟前
《javascript进阶-类(class):构造函数的语法糖》
前端·javascript
入秋21 分钟前
Three.js 实战之电子围栏可根据模型自动生成
前端·前端框架·three.js
用户61204149221323 分钟前
jsp+servlet做的咖啡品牌管理后台
java·前端·后端
Asort26 分钟前
JavaScript设计模式(三)——抽象工厂模式 (Abstract Factory)
前端·javascript·设计模式
nyf_unknown1 小时前
(vue)前端下载本地excel文件
前端·vue.js·excel
fcm191 小时前
(6) tauri之前端框架性能对比
前端·javascript·rust·前端框架·vue·react
今晚务必早点睡2 小时前
前端缓存好还是后端缓存好?缓存方案实例直接用
前端·后端·缓存