LeetCode 第2题:两数相加

题目描述

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

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

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

难度

中等

题目链接

https://leetcode.cn/problems/add-two-numbers/

示例

示例 1:

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

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

解题思路

方法:模拟加法运算

这道题本质上是在模拟我们小学学习的加法运算过程,只是在链表中进行。

关键点:

  1. 链表是逆序存储的,即最低位在链表头部,这正好符合我们从低位到高位的加法运算顺序
  2. 需要处理进位(carry)情况
  3. 注意链表长度不同的情况
  4. 最后还要检查是否有进位需要增加新节点

具体步骤:

  1. 创建一个虚拟头节点(dummy node),简化插入操作
  2. 同时遍历两个链表,模拟加法运算:
    • 获取当前两个节点的值(如果节点为空则值为0)
    • 计算和(需要加上上一步的进位)
    • 创建新节点存储个位数
    • 更新进位值
  3. 遍历结束后,检查是否还有进位,如有则添加新节点
  4. 返回虚拟头节点的下一个节点

时间复杂度:O(max(m,n)),其中 m 和 n 分别为两个链表的长度

空间复杂度:O(max(m,n)),需要创建一个新链表

代码实现

C# 实现

/**
* Definition for singly-linked list.
* public class ListNode {
* public int val;
* public ListNode next;
* public ListNode(int val=0, ListNode next=null) {
* this.val = val;
* this.next = next;
* }
* }
*/
public class Solution {
public ListNode AddTwoNumbers(ListNode l1, ListNode l2) {
// 创建虚拟头节点
ListNode dummy = new ListNode(0);
ListNode current = dummy;
int carry = 0; // 进位值 // 当两个链表都没有遍历完,或者还有进位时继续循环
while (l1 != null || l2 != null || carry > 0) {
// 获取当前节点的值,如果节点为空则值为0
int x = l1 != null ? l1.val : 0;
int y = l2 != null ? l2.val : 0; // 计算和与进位
int sum = x + y + carry;
carry = sum / 10; // 创建新节点
current.next = new ListNode(sum % 10);
current = current.next; // 移动指针
l1 = l1?.next;
l2 = l2?.next;
} return dummy.next;
}
}

代码详解

  1. ListNode dummy = new ListNode(0):创建虚拟头节点,简化链表操作
  2. while (l1 != null || l2 != null || carry > 0)
    • 只要还有节点未处理或者还有进位,就继续循环
  3. int x = l1 != null ? l1.val : 0
    • 如果l1节点存在,获取其值;否则用0代替
  4. sum = x + y + carry
    • 计算当前位的和,包含上一位的进位
  5. carry = sum / 10
    • 计算新的进位值
  6. current.next = new ListNode(sum % 10)
    • 创建新节点,存储个位数
  7. l1 = l1?.next
    • 使用空条件运算符安全地移动指针

执行结果

  • 执行用时:92 ms
  • 内存消耗:48.4 MB

总结与反思

  1. 这是一道经典的链表操作题目,考察了:

    • 链表的基本操作
    • 进位处理
    • 边界条件的处理
  2. 使用虚拟头节点(dummy node)是简化链表操作的常用技巧
  3. 代码中使用了C#的空条件运算符(?.),使代码更简洁安全
  4. 关键是要考虑到:
    • 两个链表长度可能不同
    • 最后可能还有进位需要处理
    • 不要忘记释放虚拟头节点

相关题目

  • LeetCode 第445题:两数相加 II
  • LeetCode 第43题:字符串相乘
  • LeetCode 第66题:加一
  • LeetCode 第369题:给单链表加一

LeetCode 第2题:两数相加的更多相关文章

  1. 【LeetCode题解】2_两数相加

    目录 [LeetCode题解]2_两数相加 描述 方法一:小学数学 思路 Java 代码(非递归写法) Java 代码(递归写法) Python 代码(非递归写法) [LeetCode题解]2_两数相 ...

  2. Leetcode(2)两数相加

    Leetcode(2)两数相加 [题目表述]: 给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字. 如果,我们将这两 ...

  3. LeetCode刷题--两数相加(中等)

    题目描述 给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字. 如果,我们将这两个数相加起来,则会返回一个新的链表来表 ...

  4. Leetcode(二)两数相加

    两数相加 题目描述 给出两个非空的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字. 如果,我们将这两个数相加起来,则会返回一个新的链 ...

  5. LeetCode 0、《两数相加》

    一.给定两个非空链表来表示两个非负整数.位数按照逆序方式存储,它们的每个节点只存储单个数字.将两数相加返回一个新的链表. 你可以假设除了数字 0 之外,这两个数字都不会以零开头. 示例: 输入:(2 ...

  6. LeetCode题解002:两数相加

    两数相加 题目 给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字 如果,我们将这两个数相加起来,则会返回一个新的链表 ...

  7. Leetcode(2)-两数相加(包含链表操作的注意事项)

    给定两个非空链表来表示两个非负整数.位数按照逆序方式存储,它们的每个节点只存储单个数字.将两数相加返回一个新的链表. 你可以假设除了数字 0 之外,这两个数字都不会以零开头. 示例: 输入:(2 -& ...

  8. leetCode刷题 | 两数相加

    给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字. 如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和 ...

  9. leetcode每日一题——两数之和

    题目: 两数之和 难度: 简单 描述: 给定一个整数数组和一个目标值,找出数组中和为目标值的两个数. 你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用. 解法: class Solutio ...

  10. 【leetcode】 算法题 两数之和

      问题       给定一个整数数组和一个目标值,找出数组中和为目标值的两个数. 你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用. 示例: 给定 nums = [2, 7, 11, 1 ...

随机推荐

  1. Nuxt.js 应用中的 webpack:done 事件钩子

    title: Nuxt.js 应用中的 webpack:done 事件钩子 date: 2024/11/26 updated: 2024/11/26 author: cmdragon excerpt: ...

  2. 全网最详细的Spring入门教程

    为什么用Spring 什么是Spring Spring 是一款开源的轻量级 Java 开发框架,旨在提高开发人员的开发效率以及系统的可维护性. Spring的一个最大的目的就是使JAVA EE开发更加 ...

  3. Arrays Basics

    `#include ; using namespace std; int main() { int A[5];//数组的声明 int B[5] = { 2,4,6,8,10 };//数组的声明和初始化 ...

  4. 面试官:DNS解析都整不明白,敢说你懂网络?我:嘤嘤嘤!

    一.写在开头 在OSI七层协议模型中应用层是距离我们最近,且日后开发使用到最多的一层,在上一篇博文中我们已经学习了应用层中的HTTP协议,在本文中我们再一起来学一下DNS.啥?DNS不是很了解?那还不 ...

  5. 腾讯云TKE-PV使用COS存储案例:容器目录权限问题

    背景 在TKE的集群中创建工作负载并把某一个对应的cos桶的根目录挂载到/data目录,在镜像构建的时候有把/data目录设置权限为755,但是运行容器后成功挂载cos桶的根目录到/data/目录,发 ...

  6. 中电金信发布两款大模型产品,打通AI+应用“最后一公里”

    近年来,以大模型为代表的人工智能技术已成为引领新一代产业变革的核心动力.2024年政府工作报告首次提出"人工智能+",要求"大力推进现代化产业体系建设,加快发展新质生产力 ...

  7. MySQL 优化利器 SHOW PROFILE 的实现原理

    背景 最近碰到一个 case,通过可传输表空间的方式导入一个 4GB 大小的表,耗时 13 分钟. 通过PROFILE定位,发现大部分耗时竟然是在System lock阶段. mysql> se ...

  8. 【Javaweb】在项目中添加MyBatis依赖等

    pom.xml 仓库 如果你没有配置阿里云仓库镜像源,可以到这里来找 https://mvnrepository.com/ 如果你配置了阿里云仓库镜像源,可以来这里找 https://develope ...

  9. mysql5.7以后group by 报错 sql_mode=only_full_group_by的解决方法

    一.发现问题 1.查询语句 SELECT * from class group by class_name; 2.报错结果 ..... this is incompatible with sql_mo ...

  10. apache install

    https://www.gnu.org/software/libtool/ ./configure --prefix=/usr/local/libtoolmakesudo make install h ...