题目实际上非常简单,但使用力扣平台和其他OJ平台不同,力扣不需要头文件,输入,输出,只需要按照给定的端口完成函数的编写,再返回即可。
#本题用到的思路:
倘若将此题放在其他OJ上,是非常简单的,但由于是在力扣,则需要按照力扣的规则解题。思路没什么好说的,两个链表中的数相加,可以选择维护进位值,也可以像我一样选择维护两个链表,使他们的长度相同,长度短者用零补之,再相加,其中有几个特别好的思路我想要在放出代码之后讲一下。
/**
* 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 *p = l1,*q = l2;
int len1 = 1,len2 = 1;
while(p->next != NULL){
len1++;
p = p->next;
}
while(q->next != NULL){
len2++;
q = q->next;
}
if(len1>len2){
for(int i=1;i<=len1-len2;i++){
q->next = new ListNode(0);
q = q->next;
}
}
else{
for(int i=1;i<=len2-len1;i++){
p->next = new ListNode(0);
p = p->next;
}
}
ListNode *l3 = new ListNode(-1);
ListNode *w = l3;
int jw = 0;
p = l1,q = l2;
while(p != NULL&&q != NULL){
int i = p->val + q->val + jw;
w->next = new ListNode(i%10);
if(i>=10) jw = 1;
else jw = 0;
w = w->next;
p = p->next;
q = q->next;
}
if(jw){
w->next = new ListNode(1);
w = w->next;
}
return l3->next;
}
};
①构造函数的妙用:妙用了C++的构造函数。对于C++而言,struct结构体和class类实际上都是类,只是struct结构体对外默认为public访问权限,而class对外默认private。因此,就算是结构体,也可以像类一样拥有自己的构造函数,本题就是这样,不需要自己用new建立并初始化一大堆数据,来加入链表当中,只需要使用题目中预先给出的构造函数接口即可。
②进位值:由于是两个数相加,学编程的人一定接触过大整数运算,而这道题的思路与大整数加法完全一致,而加法进位的进位制只能是0或1,因此进位值甚至可以直接用布尔变量代替,虽然我的代码中没有展示。
③指针变量的移动:这并不是一个所谓好的思路,只是一个提醒。由于本人是第一次使用力扣刷题,尚未弄清如何调试,因此寻找错误花费了我一个小上午。不要忘记在最后相加时需要三个指针一起移动,缺一不可。
④返回值:这也是一个提醒而不是一个思路,力扣不需要你帮助他输出,而需要返回一个值,这个值可能是一个数,一个字符串,一段链表甚至一个数组。
最后
以上就是聪明咖啡最近收集整理的关于2020.11.29~两数相加~记第一次在LeetCode上刷题的全部内容,更多相关2020内容请搜索靠谱客的其他文章。
发表评论 取消回复