您的位置:首页 > 编程语言 > C语言/C++

Lintcode167.链表求和C++

2017-03-28 22:04 239 查看
1.问题描述:你有两个用链表代表的整数,其中每个节点包含一个数字。数字存储按照在原来整数中
相反
的顺序,使得第一个数字位于链表的开头。写出一个函数将两个整数相加,用链表形式返回和

2.解题思路:从两条链表的最开始节点一个个相加每的个节点只能存取<10的元素,所以直接对于每次节点相加的值取余,保存取余之后的值,通过/10来保存进位的值,每次存入值的时候就新建节点来保存数据,还要判断两条链表的情况,根据是否为空,那一条先为空来分类,最后总结写出代码。注意不要空间复杂度和时间复杂度不要太高。

3.通过的代码:

/**

 * Definition for singly-linked list.

 * struct ListNode {

 *     int val;

 *     ListNode *next;

 *     ListNode(int x) : val(x), next(NULL) {}

 * };

 */

class Solution {

public:

    /**

     * @param l1: the first list

     * @param l2: the second list

     * @return: the sum list of l1 and l2

     */

    ListNode *addLists(ListNode *l1, ListNode *l2) {

        // write your code here

         if(l1==NULL&&l2==NULL) return NULL;

        ListNode *head=new ListNode(0);

        ListNode *rear=head;

        int m=0;

        while(l1!=NULL&&l2!=NULL)

        {

            m=l1->val+l2->val+m;

            rear->next=new ListNode(m%10);

            l1=l1->next;

            l2=l2->next;

            rear=rear->next;

            m=m/10;

        }

        ListNode *temp;

        if(l1==NULL){temp=l2;}else{temp=l1;}

        while(temp!=NULL)

        {

            m=temp->val+m;

            rear->next=new ListNode(m%10);

            temp=temp->next;

            rear=rear->next;

            m=m/10;

        }

        if(m==1)

        rear->next=new ListNode(1);

        return head->next;

    }

};

4.感想:

做这道题简直一波三折,刚开始觉得好难啊,怎么写啊,不知道怎么写,但是看以前的解决问题的代码的时候突然来了思路,清清楚楚的搞懂了题意,自己就开始写代码,自己刚开始写的就是分很多种情况,程序很长,提交的代码就是wrong answer 改正了一些小错误之后 又出现runtime error,运行时出现错误,我觉得自己代码是正确的,自己也画图验证了很多次,但是每次都是这个错误,自己看了看是自己在创建节点的时候出现了错误。改过的还是没有通过。我在百度上搜索了一下答案,感觉我们的思路是差不多,只是我的有些繁琐,我又自己简化了一下程序,还是一直出现错误MLE,说我空间复杂度太高了,一直不让我通过。问了问其他人,他们有的人也有这样的错误,他们让我把有些两步的步骤融合成了一步。之后就通过了,最后对于这道题对于我来说也是最印象深刻的一道题,从开始思考思路到真正的通过用了两天半的时间,对于他的不能通过的原因还是没有太明白,下一步会问问同学或者是老师搞明白的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: