Leetcode 第二题 Add Two Numbers (c++)

首先,这个数组是逆序排序的。。。

我开始想的是按顺序读出链表中的值组成真正的值i,j,然后直接计算i+j。

其中,

i=i*10+l1->val;

但是,这个适合正序的,不适合逆序。。。

本来想直接使用进位进行计算,但是逻辑上出现了问题。

首先,最开始想的循环条件是

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

然后只剩下l1不为空或者l2不为空,然后分别把l1,l2后面的值续在结果的后边就行了,但是,没考虑到还需要同时处理最后一次的进位算符。

以下为所错误代码

/**
 * 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(-1); //储存结果
        ListNode* p=result;
        int count=0;

        while(l1!=NULL && l2!=NULL){
            int sum=l1->val+l2->val+count;
            p->next=new ListNode(sum%10);
            if( sum/10 !=0){
                count = 1;
            }
            else{
                count=0;
            }
            l1=l1->next;
            l2=l2->next;
            p=p->next;
        }
//只剩下l1或者l2
        if(count==1){
            p->next=new ListNode(1);
        }

        bool flag=0; //看是否为第一次,需要考虑进位
        for(;l1!=NULL;l1=l1->next,p=p->next){
            if(flag==0){
                p->next=new ListNode(l1->val+count);
            }
            else{
                p->next=new ListNode(l1->val);
            }
            flag=1;
        }
        for(;l2!=NULL;l2=l2->next,p=p->next){
            if(flag==0){
                p->next=new ListNode(l2->val+count);
            }
            else{
                p->next=new ListNode(l2->val);
            }
            flag=1;
        }
        return result->next;
    }
};

这么下来发现
[1]
[9,9]
输出:
[0,10]
预期:
[0,0,1]

样例过不去。因为还需要考虑第一次进位count和原数相加是否会大于等于10,若为10,还需要进一步处理。

正确思路为:首先判断跳出循环后的第一次进位是否会出现特殊情况

情况1:l1,l2都是空的,但是count=1,需要添加一位。

情况2:l1还有,count=1,并且,第一次count+l1->val 还需要处理进位。

情况3:同上,只不过把l1换成l2。

其实一共有三个变量,但是只需要独立考虑l1和count的关系和l2和count的关系,他们又是对称的,所以只需要考虑一种

 l1=空l1不空
count=0直接续上直接续上
count=1多添加一位看其是否产生进位

因为此算法较为繁琐,故后来放弃。

后来,采用了判断条件

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

代码如下

class Solution {
public:
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
        ListNode* result = new ListNode(-1); //储存结果
        ListNode* p=result;
        int count=0;
        while(l1!=NULL || l2!=NULL){
            int sum=0; //因为是或运算,可能出现l1或l2为空的情况,会导致无val值,所以需要if来筛选
            if(l1!=NULL){
                sum+=l1->val;
                l1=l1->next; //最开始把该句写在了if外面,会导致程序执行错误。
            }  
            if(l2!=NULL){
                sum+=l2->val;
                l2=l2->next;//同上
            }
            if(count!=0)
                sum+=count;

            p->next=new ListNode(sum%10);
            if( sum/10 !=0){
                count = 1;
            }
            else{
                count=0;
            }
            p=p->next;
        }
        //最后单独考虑l1,l2都用完了,但是count=1的情况。
        if(count==1)
            p->next=new ListNode(1);
        return result->next;
    }
};

该算法还算比较简介,只需要注意循环中对l1,l2空值的处理即可。

 

ps:好久没编程了,还是生疏了。。。就这还弄了半天。。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值