关于Leetcode的刷题方法,在网上看了很多,每个人都有着不同的见解。作为Leetcode小白,我还是决定用最原始的方法进行刷题,即把每一题的思路都记录下来,虽然比较耗时间,但是个人感觉这样子的方法会让我对题目有更深入的了解。希望能在该专栏中记录下刷题过程中遇到的大大小小的问题🍊。
题目描述
- 题目模板如下:
解题思路
- 本题考察的是链表的知识点,难点有两个:
- 若两个数字的位数不同,如何处理多余的位数
- 若产生进位,应当如何处理
-
首先创建两个指针分别指向两个数字的第一位,创建存放最终结果的指针p
-
情况1.处理两个数都含有的位数,然后再对多余位数进行处理。
- 如果当前位数在两个数字中均存在,则计算指针p在该位数上的结果。
- 让两个指针向后挪一位
- 若两个指针均不为NULL,则表示下一次循环仍归属于当前的大前提中,此时为指针p分配下一个空间:
- 若无进位,则分配下一个位置的空间时候的初始化值为0
- 若有进位,首先对当前值减去10,则分配下一个位置时候的空间的初始化值为1
-
情况2.指向两个数的指针有一个不为NULL,另一个为NULL
- 此时我们仍然需要为p分配新的空间,然后为其赋值
- 需要注意的一点:此时仍然需要考虑进位的问题,因为情况1最后处理完的一个循环结束之后是可能存在进位问题的。
-
情况3.上面我们提到,如果执行完情况1之后进入了情况2,若进位,会在情况2里面处理进位。但是如果执行完情况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) {
ListNode * result = new ListNode(0),*p = result,*x1 = l1,*x2 = l2;
//情况1:x1,x2均存在
while(x1 && x2){
p->val += x1->val + x2->val;
x1 = x1->next;
x2 = x2->next;
//处理进位问题,并根据是否进位决定p新分配的空间初始化的值为多少
if(x1 && x2){
if(p->val >=10){
p->val-=10;
p->next = new ListNode(1);
}
else{
p->next = new ListNode(0);
}
p = p->next;
}
}
//情况2:x1,x2有且仅有一个存在
while(x1 || x2){
if(p->val >=10){ //处理进位问题,并分配新的空间
p->val-=10;
p->next = new ListNode(1);
}
else{
p->next = new ListNode(0);
}
p = p->next; //指向新的空间
if(x1){ //计算p的val值
p->val += x1->val;
x1 = x1->next;
}
else{
p->val += x2->val;
x2 = x2->next;
}
}
//情况3:处理情况1之后未进位的问题
if(p->val >=10){
p->val-=10;
p->next = new ListNode(1);
}
return result;
}
};