“
两数相加
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
解题思路:比如 a+b
数字上考虑三种情况,是a先被遍历完还是b先遍历完,还是两个一起先被遍历完。
无论哪一种,都要考虑当前计算是否有进位带来的影响:前两种m,当心被被遍历完的数字的最后参与运算的一个进位标志,r如果存在进位,则后续没被执行完的那个也要更新如:1+199=200; 最后一种情况,d即使两个数字都结束了遍历,也可能还有一个进位。比如:12+88=100;
1)没有看到节点类型没有默认构造函数,所以申请时候未给它初始化数值
2)没有考虑到最后一个循环里面while循环变量的更新,然后我发现我也没考虑到申请的对于节点-1节点,恰好一起在最后一个while循环中改了。
3)p指针错用free释放,应用delete。
```cpp
/**
* 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* l1ptr, *l2ptr, *l3ptr;//遍历两个输入串的指针,遍历结果串的指针
l1ptr = l1, l2ptr = l2;
ListNode* addNum = new ListNode(-1);
l3ptr = addNum;
int CarryFlag = 0, curAdd = 0;//进位标志和当前数字和。
while (l1ptr != NULL&&l2ptr != NULL) {//两个数字都没被加完时
curAdd = l1ptr->val + l2ptr->val;
if (CarryFlag) curAdd++;//上一次若有进位则加进来
if (CarryFlag = curAdd/10) curAdd -= 10;//如果有k进位则更新进位,和当前数字和。
l3ptr->val = curAdd;//第三链表指针更新
l3ptr->next = new ListNode(-1);
l3ptr = l3ptr->next;
l1ptr = l1ptr->next;//更新两个输入链表
l2ptr = l2ptr->next;
}
//restPtr代表不空的那个(最多有一个),如果restPtr也空,则n不会进入下个if。
ListNode* restPtr = ( (l1ptr != NULL) ? l1ptr : l2ptr );
if (restPtr != NULL) {//数字1链表还没用完
while (restPtr != NULL) {
curAdd = restPtr->val;
if (CarryFlag == 1) curAdd++;//若有进位则+1;
if (CarryFlag = curAdd / 10) curAdd -= 10;//判断一下是否还有进位,如果有只留一位数。
l3ptr->val = curAdd;
l3ptr->next = new ListNode(-1);
l3ptr = l3ptr->next;
restPtr = restPtr->next;
}
}
//到这里时,数字链表一定都用完,记得这三种情况都要判断是否最后时刻还有进位,以及前面多申请的val=-1的节点。
ListNode*pre = addNum,*p=pre->next;
while (p->next != NULL) {
pre = p;
p = p->next;
}
if (CarryFlag != 0) p->val = 1;
else{
pre->next = NULL;
delete p;
}
return addNum;
}
};
```
”