探索LeetCode【0002】
创始人
2025-05-29 22:25:10
0

题目在此【0002】两数相加

1、官方答案(没搞懂)

https://leetcode.cn/problems/add-two-numbers/solution/liang-shu-xiang-jia-by-leetcode-solution/

/*** 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;		// 此处没看懂,搜索语法效果不佳// 如果n2=l2,那么应该是什么的值设置为l2的值?如果n2!=l2,那么应该是什么的值设置为0?int sum = n1 + n2 + carry;if (!head) {head = tail = new ListNode(sum % 10);	//相加和的个位放在新的结点,但是为什么跟head、tial有关?head、tial用来指什么?} 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 = tail = new ListNode(sum % 10);	//相加和的个位放在新的结点,但是为什么跟head、tial有关?head、tial用来指什么?} else {tail->next = new ListNode(sum % 10);	//相加和的个位放在新的结点,但是为什么跟tial有关?tail = tail->next;
}

2、第二个参考答案

https://leetcode.cn/problems/add-two-numbers/solution/liang-shu-xiang-jia-by-gpe3dbjds1/

2.1 思路一(不完全懂)

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

  1. 获取两个链表所对应的长度
  2. 在较短的链表末尾补零
  3. 对齐相加考虑进位
/*** 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){i=count+p->val+q->val;// 沙比,前面的count是bool型...此处何解?// 难道true可以当作数值1来进行加减运算?// 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(代表每个位的和的结果)加上,考虑进位。

/*** 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之间到底是什么关系?

相关内容

热门资讯

AWSECS:访问外部网络时出... 如果您在AWS ECS中部署了应用程序,并且该应用程序需要访问外部网络,但是无法正常访问,可能是因为...
AWSElasticBeans... 在Dockerfile中手动配置nginx反向代理。例如,在Dockerfile中添加以下代码:FR...
银河麒麟V10SP1高级服务器... 银河麒麟高级服务器操作系统简介: 银河麒麟高级服务器操作系统V10是针对企业级关键业务...
北信源内网安全管理卸载 北信源内网安全管理是一款网络安全管理软件,主要用于保护内网安全。在日常使用过程中,卸载该软件是一种常...
AWR报告解读 WORKLOAD REPOSITORY PDB report (PDB snapshots) AW...
AWS管理控制台菜单和权限 要在AWS管理控制台中创建菜单和权限,您可以使用AWS Identity and Access Ma...
​ToDesk 远程工具安装及... 目录 前言 ToDesk 优势 ToDesk 下载安装 ToDesk 功能展示 文件传输 设备链接 ...
群晖外网访问终极解决方法:IP... 写在前面的话 受够了群晖的quickconnet的小水管了,急需一个新的解决方法&#x...
不能访问光猫的的管理页面 光猫是现代家庭宽带网络的重要组成部分,它可以提供高速稳定的网络连接。但是,有时候我们会遇到不能访问光...
Azure构建流程(Power... 这可能是由于配置错误导致的问题。请检查构建流程任务中的“发布构建制品”步骤,确保正确配置了“Arti...