题目在此【0002】两数相加
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;
}
https://leetcode.cn/problems/add-two-numbers/solution/liang-shu-xiang-jia-by-gpe3dbjds1/
将长度较短的链表在末尾补零使得两个连表长度相等,再一个一个元素对其相加(考虑进位)
/*** 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类型的加法运算感到困惑?!
不对齐补零,若链表不为空则用 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之间到底是什么关系?