美文网首页算法与C++
Leetcode 2 the sum of two num

Leetcode 2 the sum of two num

作者: Vophan | 来源:发表于2019-01-17 16:09 被阅读2次

题目解析:

将数字以链表的形式逆序储存,每个Node储存一位数字。

然后实现两个链表相加。

思路解析:

1、数字的位数可能不同,我们怎么解决这个问题,开始我想的特别复杂,想的是先比较两个链表的长短,然后在把所有数都加到长的链表上,但是简单的方法应该是不用考虑那么多,另外定义一个链表,然后将每次加和的结果放到这个链表里,如果长度不一,也没关系,只需要加完长度相同的部分,再去循环剩下的部分。

2、还需要考虑进位,两数之和大于10的情况,开始我的想法是什么呢?就是计算加和,然后求出模10的结果,思路应该没问题,但是因为前面大方向的错误,导致耦合性特别高,牵一发而动全身,导致后面各种错误。(吸取教训)

3、在最后也要注意,最后以为相加若大于0,那么我们还得进位。

代码:

/**
 * 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* p=new ListNode(0);
        ListNode* top=p;
        ListNode* q=NULL;
        int flag =0;
        int tmp;
        while(l1&&l2)
        {
            tmp=l1->val+l2->val+flag;
            flag=tmp/10;
            q=new ListNode(tmp%10);
            p->next=q;
            p=p->next;
            l1=l1->next;
            l2=l2->next;
        }
        while(l1)
        {
            tmp=l1->val+flag;
            q=new ListNode(tmp%10);
            flag=tmp/10;
            p->next=q;
            p=p->next;
            l1=l1->next;
        }
        while(l2)
        {
            tmp=l2->val+flag;
            q=new ListNode(tmp%10);
            flag=tmp/10;
            p->next=q;
            p=p->next;
            l2=l2->next;
        }
        if(flag==1) 
        {
            q=new ListNode(1);
            p->next=q;
        }
        return top->next;
    }

};

反思

1、思路一定要清晰,把握好大方向,尽最大可能将大的问题化为小的问题,并且一定要降低耦合性,否则你会杀死自己的,一定要记住今天的教训。

2、对链表的一些思考,链表真的是方便插入,所以我们在使用时,就会很方便,只需要将指针对应起来就行

3、还有一定要用笔将整个过程想清楚,不要什么都没想清楚就开始打代码。

相关文章

网友评论

    本文标题:Leetcode 2 the sum of two num

    本文链接:https://www.haomeiwen.com/subject/lfbidqtx.html