LeetCode: Add Two Number(已解原先出现的问题)

You are given two non-empty linked lists representing two non-negative integers. The digits are stored in reverse order and each of their nodes contain a single digit. Add the two numbers and return it as a linked list.

You may assume the two numbers do not contain any leading zero, except the number 0 itself.

Input: (2 -> 4 -> 3) + (5 -> 6 -> 4)
Output: 7 -> 0 -> 8

思路:
刚看到这个题的时候,写着中等难度,第一眼感觉,这不就是类似于多项式想加么,于是就直接写了一个简单的想加算法,没有考虑过链表会是什么形式,然后提交的时候输出答案是对的,但是确认答案的时候系统出了不同的链表测试算法,该算法就不合适了,各种BUG。。。。
也就是说链表相加会出现以下情况:
1、 (9)+(9)=(8,1);即多出一个节点
2、(9,9)+(9)=(8,0,1),多出一个节点或者N个节点
于是有了些想法,第一种,就是给每个链表添加计数flag1,flag2,然后把两个链表补齐,例如(2->4)+(2->3->4),则(2->4)补齐为(2->4->0),但是问题就是,要是计算量过大,要补齐其中一条链表,那就回很废内存,不是一个明智的做法。
第二种想法,是通过把第二条链表加到第一条链表,若第二条链表尾指针为NULL,则想加结束,一些例子想加成功了,但是一些却在相加的过程中进1出现了问题….正在调试中ORZ 。
(后面在代码中添加了一个 if_gonext,判断指向L1链表的指针r1是否向下一个节点走,因为在下面代码中,在相加系数的时候我没有将r1指针指向下一个节点,只把r2指针指向下一个节点,r1指向下一个节点的操作在while(r1->val>=10)这个循环中进行,若r1->val<10的时候,指针就不移动了,所以增添了一个bool值去判断)

代码如下:
/**
 * 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) {
        int f1=0,f2=0;
        auto r1=l1;//指向l1链表
        auto r2=l2;//指向l2链表
        auto temp=l2;//用于删除l2链表的空余节点
        int add=0;//进一位的计数
        bool if_gonext;//r1是否去下一个节点
        while(r2!=NULL)
        {
            if_gonext=true;
            if(f1==f2)
            {    
                r1->val+=r2->val;
                r2=r2->next;
                f2++;
                delete temp;
                temp=r2;
            }
            else if(f1<f2)
            {
                r1->next=r2;
                r1=r1->next;
                r2=r2->next;
                f1++;
                f2++;
                break;
            }
            r1->val+=add;
            add=0;
            while(r1->val>=10)
            {
                if_gonext=false;
                r1->val%=10;
                ++add;
                if(r1->next==NULL)
                {
                    auto node=new ListNode(add);
                    r1->next=node;
                    r1=r1->next;
                    f1++;
                    add=0;
                }
                else
                {
                    r1=r1->next;
                    r1->val+=add;
                    f1++;
                    add=0;
                    if(f1>=f2&&r2!=NULL)
                        break;
                }
            }
            if (r1->next != NULL&&if_gonext==true)
            {
                r1 = r1->next;
                f1++;
            }
            if(r2==NULL)
            {
                delete r2;
                r2=NULL;
            }
        }
        return l1;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值