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、提交结果

相关推荐
wycode8 分钟前
Vue2源码笔记(1)编译时-模板代码如何生效之生成AST树
前端·vue.js
程序员嘉逸24 分钟前
LESS 预处理器
前端
橡皮擦19927 分钟前
PanJiaChen /vue-element-admin 多标签页TagsView方案总结
前端
程序员嘉逸31 分钟前
SASS/SCSS 预处理器
前端
咕噜分发企业签名APP加固彭于晏1 小时前
腾讯云eo激活码领取
前端·面试
子林super1 小时前
MySQL 复制延迟的排查思路
前端
CondorHero1 小时前
轻松覆盖 Element-Plus 禁用按钮样式
前端
源猿人1 小时前
nginx代理如何配置和如何踩到坑篇
前端·nginx
Captaincc1 小时前
TRAE 首场 Meetup:8月16日,期待与你在北京相聚
前端·后端·trae
vaelcy1 小时前
Cursor入门级教程,下载、安装、AI核心功能简介
前端·ai编程·cursor