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

相关推荐
再学一点就睡5 小时前
初探 React Router:为手写路由筑牢基础
前端·react.js
悟空聊架构5 小时前
5 分钟上手!Burp 插件「瞎越」一键批量挖垂直越权
前端
炒毛豆6 小时前
vue3+antd实现华为云OBS文件拖拽上传详解
开发语言·前端·javascript
Pu_Nine_96 小时前
Axios 实例配置指南
前端·笔记·typescript·axios
红尘客栈26 小时前
Shell 编程入门指南:从基础到实战2
前端·chrome
前端大卫7 小时前
Vue 和 React 受控组件的区别!
前端
Hy行者勇哥7 小时前
前端代码结构详解
前端
练习时长一年7 小时前
Spring代理的特点
java·前端·spring
水星记_8 小时前
时间轴组件开发:实现灵活的时间范围选择
前端·vue
2501_930124708 小时前
Linux之Shell编程(三)流程控制
linux·前端·chrome