LeetCode 第2题:两数相加
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
- 题目数据保证列表表示的数字不含前导零
解题思路
方法:模拟加法运算
这道题本质上是在模拟我们小学学习的加法运算过程,只是在链表中进行。
关键点:
- 链表是逆序存储的,即最低位在链表头部,这正好符合我们从低位到高位的加法运算顺序
- 需要处理进位(carry)情况
- 注意链表长度不同的情况
- 最后还要检查是否有进位需要增加新节点
具体步骤:
- 创建一个虚拟头节点(dummy node),简化插入操作
- 同时遍历两个链表,模拟加法运算:
- 获取当前两个节点的值(如果节点为空则值为0)
- 计算和(需要加上上一步的进位)
- 创建新节点存储个位数
- 更新进位值
- 遍历结束后,检查是否还有进位,如有则添加新节点
- 返回虚拟头节点的下一个节点
时间复杂度: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;
}
}
代码详解
ListNode dummy = new ListNode(0):创建虚拟头节点,简化链表操作while (l1 != null || l2 != null || carry > 0):- 只要还有节点未处理或者还有进位,就继续循环
int x = l1 != null ? l1.val : 0:- 如果l1节点存在,获取其值;否则用0代替
sum = x + y + carry:- 计算当前位的和,包含上一位的进位
carry = sum / 10:- 计算新的进位值
current.next = new ListNode(sum % 10):- 创建新节点,存储个位数
l1 = l1?.next:- 使用空条件运算符安全地移动指针
执行结果
- 执行用时:92 ms
- 内存消耗:48.4 MB
总结与反思
- 这是一道经典的链表操作题目,考察了:
- 链表的基本操作
- 进位处理
- 边界条件的处理
- 使用虚拟头节点(dummy node)是简化链表操作的常用技巧
- 代码中使用了C#的空条件运算符(?.),使代码更简洁安全
- 关键是要考虑到:
- 两个链表长度可能不同
- 最后可能还有进位需要处理
- 不要忘记释放虚拟头节点
相关题目
- LeetCode 第445题:两数相加 II
- LeetCode 第43题:字符串相乘
- LeetCode 第66题:加一
- LeetCode 第369题:给单链表加一
LeetCode 第2题:两数相加的更多相关文章
- 【LeetCode题解】2_两数相加
目录 [LeetCode题解]2_两数相加 描述 方法一:小学数学 思路 Java 代码(非递归写法) Java 代码(递归写法) Python 代码(非递归写法) [LeetCode题解]2_两数相 ...
- Leetcode(2)两数相加
Leetcode(2)两数相加 [题目表述]: 给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字. 如果,我们将这两 ...
- LeetCode刷题--两数相加(中等)
题目描述 给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字. 如果,我们将这两个数相加起来,则会返回一个新的链表来表 ...
- Leetcode(二)两数相加
两数相加 题目描述 给出两个非空的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字. 如果,我们将这两个数相加起来,则会返回一个新的链 ...
- LeetCode 0、《两数相加》
一.给定两个非空链表来表示两个非负整数.位数按照逆序方式存储,它们的每个节点只存储单个数字.将两数相加返回一个新的链表. 你可以假设除了数字 0 之外,这两个数字都不会以零开头. 示例: 输入:(2 ...
- LeetCode题解002:两数相加
两数相加 题目 给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字 如果,我们将这两个数相加起来,则会返回一个新的链表 ...
- Leetcode(2)-两数相加(包含链表操作的注意事项)
给定两个非空链表来表示两个非负整数.位数按照逆序方式存储,它们的每个节点只存储单个数字.将两数相加返回一个新的链表. 你可以假设除了数字 0 之外,这两个数字都不会以零开头. 示例: 输入:(2 -& ...
- leetCode刷题 | 两数相加
给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字. 如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和 ...
- leetcode每日一题——两数之和
题目: 两数之和 难度: 简单 描述: 给定一个整数数组和一个目标值,找出数组中和为目标值的两个数. 你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用. 解法: class Solutio ...
- 【leetcode】 算法题 两数之和
问题 给定一个整数数组和一个目标值,找出数组中和为目标值的两个数. 你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用. 示例: 给定 nums = [2, 7, 11, 1 ...
随机推荐
- bootstrap table 搜索只从当前页开始搜
项目中出现的情况,使用bootstrap table框架,使用搜索功能的是后查询的结果不是从第一也开始,有时候点击搜索第一次查不出来结果,点击第二次结果才出现. 解决方法: $("#btn_ ...
- Spring IOC、DI、AOP原理和实现
(1)Spring IOC原理 IOC的意思是控件反转也就是由容器控制程序之间的关系,把控件权交给了外部容器,之前的写法,由程序代码直接操控,而现在控制权由应用代码中转到了外部容器,控制权的转移是 ...
- .net core想到哪写道哪之asp.net core的机密
我们往往需要在项目里使用一些机密数据,比如数据库的密码,再比如一些密钥.这些东西一般来说我们都会放到配置文件里. 但是这些东西是跟自己的账号相关的,我们在一些多人合作的项目中,尤其是开源项目肯定不能直 ...
- HashMap 源码解毒
PUT 方法解毒: hashcode 高低16进行异或运算,尽量降低哈希冲突的概率 如果数组很小,hashcode的高位就不能被很好利用. final V putVal(int hash, K key ...
- Yacc笔记
语义动是一个C语句的序列 $$ 表是和相应产生式头的非终结符号关联的属性值 $i 表示和相应产生式体中第 i 个文法符号(终结符或非终结符号)关联的属性值 按照产生式规约时会执行关联的语义动作 对于 ...
- Element Plus组件v-loading在el-dialog组件上使用无效
前情 公司有经常需要做一些后台管理页面,我们选择了Element Plus,它是基于 Vue 3,面向设计师和开发者的组件库,是Vue框架生态中比较火的UI组件库,组件库丰富易用,组件链接:一个 Vu ...
- uni-app项目uview的表单验证在小程序上不生效
前情 uni-app是我比较喜欢的跨平台框架,它能开发小程序/H5/APP(安卓/iOS),重要的是对前端开发友好,自带的IDE让开发体验非常棒,公司项目就是主推uni-app,在uniapp生态中u ...
- Fiddler抓包iOS手机配置全流程
前情 平时做移动移动端开必的时候经常需要抓包手机,用于接口请求跟踪,但iOS的抓包经常性的配不成功,经过踩过不少坑后终于知道了整个配置流程,此文记录Fiddler抓包iOS手机的配置流程. Step ...
- GraphRAG+文档结构:打造高性能实体溯源方案
作者:陈梓康 众所周知,GraphRAG将文档内容抽取为知识图谱三元组后,实际上仅保留了关联性知识信息,因此不可避免地会丢失原文的一些内容细节.在对数据完整度要求严格的业务场景,如金融.医疗.保险等行 ...
- SQL Server Profiler的trc文件生成阻止
很奇葩,sqlserver自动生成trc文件,每分钟一个,重启服务器也没用. 解决思路: 查询现在正在跑的trace进程 select * from sys.fn_trace_getinfo(0); ...