探索LeetCode【0002】两数相加
创始人
2025-05-30 01:16:18

目录

  • 0、题目
  • 1、官方答案(没搞懂)
  • 2、第二个参考答案
    • 2.1 思路一(不完全懂)
    • 2.2 思路二(不完全懂)

0、题目

题目链接:【0002】两数相加

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

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

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

示例 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、官方答案(没搞懂)

官方答案

代码1

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     ListNode *next;*     ListNode() : val(0), next(nullptr) {}*     ListNode(int x) : val(x), next(nullptr) {}*     ListNode(int x, ListNode *next) : val(x), next(next) {}* };*/
class Solution {
public:ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {ListNode *head = nullptr, *tail = nullptr;	// 分别指向什么?head和tail分别干啥?int carry = 0;while (l1 || l2) {int n1 = l1 ? l1->val: 0;		// 此处没看懂,搜索语法效果不佳int n2 = l2 ? l2->val: 0;		// 此处没看懂,搜索语法效果不佳            int sum = n1 + n2 + carry;if (!head) {//相加和的个位放在新的结点,但是为什么跟head、tial有关?head、tial用来指什么?head = tail = new ListNode(sum % 10);	                               } else {tail->next = new ListNode(sum % 10);	//相加和的个位放在新的结点,但是为什么跟tial有关?tail = tail->next;}carry = sum / 10;if (l1) {l1 = l1->next;}if (l2) {l2 = l2->next;}}if (carry > 0) {							// 考虑的是最后一位相加之后,是否需要进位tail->next = new ListNode(carry);}return head;}
};

找到一些关于?用法的示例:x < 0 ? y = 10 : z = 20;这个语句被称为条件表达式,它由 3 个子表达式组成,使用问号 ? 和冒号 : 分隔。这 3 个表达式分别是:x<0,y = 10 和 z = 20。上面的条件表达式与以下 if-else 语句执行相同的操作:

if (x < 0)y = 10;
elsez = 20;

根据以上定义,那么以下代码

int n1 = l1 ? l1->val: 0;
int n2 = l2 ? l2->val: 0;

其意思是否为:
如果n1=l1,那么应该是什么的值设置为l1的值?如果n1!=l1,那么应该是什么的值设置为0?
如果n2=l2,那么应该是什么的值设置为l2的值?如果n2!=l2,那么应该是什么的值设置为0?
感觉不对劲…
回头看,感觉意味着:如果l1存在,那么将l1的值赋给n1;如果l1不存在,那么将0赋给n1!

除此之外,还有一个比较大的问题是以下代码(此部分问题尚未解决

if (!head) {//相加和的个位放在新的结点,但是为什么跟head、tial有关?head、tial用来指什么?head = tail = new ListNode(sum % 10);	} else {tail->next = new ListNode(sum % 10);	//相加和的个位放在新的结点,但是为什么跟tial有关?tail = tail->next;
}

2、第二个参考答案

答案链接

2.1 思路一(不完全懂)

将长度较短的链表在末尾补零使得两个连表长度相等,再一个一个元素对其相加(考虑进位)

  1. 获取两个链表所对应的长度
  2. 在较短的链表末尾补零
  3. 对齐相加考虑进位

代码2

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     ListNode *next;*     ListNode(int x) : val(x), next(NULL) {}* };*/
class Solution {
public:ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {int len1=1;//记录l1的长度int len2=1;//记录l2的长度ListNode* p=l1;ListNode* q=l2;while(p->next!=NULL)//获取l1的长度{len1++;p=p->next;}while(q->next!=NULL)//获取l2的长度{len2++;q=q->next;}if(len1>len2)//l1较长,在l2末尾补零{for(int i=1;i<=len1-len2;i++){q->next=new ListNode(0);q=q->next;}}else//l2较长,在l1末尾补零{for(int i=1;i<=len2-len1;i++){p->next=new ListNode(0);p=p->next;}}p=l1;						// 何必又来定义一次?q=l2;						// 何必又来定义一次?bool count=false;//记录进位ListNode* l3=new ListNode(-1);//存放结果的链表ListNode* w=l3;//l3的移动指针		// 是否多此一举?int i=0;//记录相加结果while(p!=NULL&&q!=NULL){// 沙比,前面的count是bool型...此处何解?// 难道true可以当作数值1来进行加减运算?// count+(p->val)+(q->val)???是用来计算进位的吧i=count+p->val+q->val;w->next=new ListNode(i%10);count=i>=10?true:false;w=w->next;p=p->next;q=q->next;}if(count)//若最后还有进位{w->next=new ListNode(1);w=w->next;}return l3->next; }
};

针对以上代码,主要是对代码末尾的bool类型参数count参加int类型的加法运算感到困惑?!

2.2 思路二(不完全懂)

不对齐补零,若链表不为空则用 sum(代表每个位的和的结果)加上,考虑进位。

代码3

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     ListNode *next;*     ListNode() : val(0), next(nullptr) {}*     ListNode(int x) : val(x), next(nullptr) {}*     ListNode(int x, ListNode *next) : val(x), next(next) {}* };*/
class Solution {
public:ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {ListNode* head=new ListNode(-1);//存放结果的链表ListNode* h=head;//移动指针		// 多一个h指针我是不懂的int sum=0;//每个位的加和结果bool carry=false;//进位标志while(l1!=NULL||l2!=NULL){sum=0;if(l1!=NULL){sum+=l1->val;l1=l1->next;}if(l2!=NULL){sum+=l2->val;l2=l2->next;}if(carry)sum++;h->next=new ListNode(sum%10);h=h->next;carry=sum>=10?true:false;}if(carry){h->next=new ListNode(1);}return head->next;}
};

唯一没有搞懂为什么最后返还的是return head->next;? h和head之间到底是什么关系?

相关内容

热门资讯

游戏“第一省”,坐不住了! 游... 文/冯玲玲游戏大省广东坐不住了。近日,广东发布《关于推动广东网络游戏产业高质量发展的若干政策措施》(...
并购重组预期加持!宜宾纸业股价... 本报(chinatimes.net.cn)记者何一华 李未来 北京报道宜宾纸业(600793.SH)...
德邦证券董事会大洗牌:梁雷任董... 新京报贝壳财经讯(记者胡萌)5月30日,德邦证券公示新一届董事会、监事会人员,公司新一任董事长由山东...
原创 成... 今年以来,成都的舞厅经历了比较长时间的整顿,多数舞厅在5月8日获准重新开门营业,到现在已经稳定运行了...
“小雨伞”母公司手回集团港股上... 5月30日,手回集团(2621.HK)在港交所上市。根据手回集团此前披露,此次IPO,手回集团发行2...
决策曲线拆解分析兼随机森林DC... 临床决策曲线(DCA)解析兼绘制随机森林的DCA曲线(R&...
异动快报:海格通信(00246... 证券之星5月30日盘中消息,13点45分海格通信(002465)触及涨停板。目前价格13.89,上涨...
商丘,三线城市!排名第29位! 第一财经·新一线城市研究所5月28日发布《2025新一线城市魅力排行榜》,在中国内地337座地级及以...
传统药企转型面临两难选择?放弃... 近日誉衡药业(002437.SZ)公告称,公司于2025年5月23日与兴和制药有限公司就佩玛贝特片签...
版权代理吃相太难看,连作者都觉... 一家可能都没授权资格的公司,居然也敢向自媒体发律师函讨要版权费。这事儿听起来是不是有点离谱了?最近,...
V观财报|*ST京蓝因涉嫌信披...   中新经纬5月30日电 30日晚,*ST京蓝公告,收到立案告知书。  公告显示,因涉嫌信息披露违法...
Java基础--日期API学习 一、前言         java标准库中,最早提供了两种处理日期和时间的类ÿ...
ES调试与优化工作笔记 本文主要涉及关于elastcisearch 关于内存,mapping,查...
两券商IT人员曝出老鼠仓,一位... 财联社5月30日讯(记者 高艳云)5月30日,安徽证监局与吉林证监局同日披露罚单,两名券商资深IT人...
Labubu太火了!英国人为抢... 最近在英国,有一样毛绒玩具红到了“出圈”,甚至让人忍不住怀疑:这到底是抢玩具,还是在打仗?这里,说的...
MySQL-分库分表方案 一、业务背景 随着业务量的增长,数据量会随之增长,单机情况下DB服务器会...
堆、堆排序 堆的基本操作操作:         1、插入一个数:          ...
广东1130亿饮料富豪,第二个... 来源 | 深蓝财经撰文 | 杨波近日,东鹏饮料赴港上市的消息持续引发关注。一个市值超1600亿,手握...
赵小中连任,长沙银行还有道“考... 文丨徐风5月21日,长沙银行在召开股东大会的同时完成了董事会的换届选举,赵小中当选第八届董事长,实现...
嘉应制药遭证监会立案调查,直指... 5月28日晚间,老牌药企广东嘉应制药股份有限公司(002198.SZ,下称“嘉应制药”)发布公告,公...
腾讯三大工具:ARC+智影+E... ARC实验室(网站) ARC官网-腾讯 (tencent.com)  ...
个人小站折腾后记 个人小站折腾后记 🏠个人主页:shark-Gao 🧑个...
华夏银行聘任龚伟华为首席信息官... 作者 | 林秋彤编辑 | 杨希新媒体编辑丨实习生 宋语菡5月30日,华夏银行发布公告称,吴永飞因到龄...
ST百利:收到湖南证监局《行政... 5月30日晚间,湖南百利工程科技股份有限公司(ST百利,603959.SH)公告,5月29日,公司收...
天元宠物重大资产重组,最大受益... “宠物代工龙头”天元宠物披露了收购案的最新进展。5月29日晚间,杭州天元宠物用品股份有限公司(下称“...
上手Servlet程序 目录 1、手动打包 1.1、创建项目 1.2、引入依赖 1.3、创建目录 1.4、编写代码 1.5、...
第一次认真周赛总结 T1:一个 整数的 二进制形式中 奇数位上bit==1 和 偶数 位上bit=...
1年进账270亿,深圳中药龙头... 最近,华润三九陷入了“悲喜交加”之中。喜的是,2024年华润三九的营收、净利润皆创新高,营收为276...
论文阅读:MPViT : Mu... 中文标题:基于多路视觉Transformer的密集预测 提出问题 创新点 提出了一种...
前安克创新创始人创业公司冲刺I... 近期,深圳智岩科技股份有限公司(以下简称“智岩科技”)正式启动上市辅导,辅导机构为中金公司。智岩科技...