力扣练习 1 两数之和(中等)

题目:

 

 两数相加 

给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。

如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。

您可以假设除了数字 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;

    }

};

```

你可能感兴趣的:(leetcode练习)