Leetcode--2. 两数相加(链表的操作) [2020.9.7]

Leetcode–2. 两数相加(链表的操作)

前言

  1. 这一题其实并不难,但是我还是疏忽出了点错误。首先,对该题的第一直觉是链表表示转化为int整型,然后求和后再转化为链表。但是缺疏忽了万一链表长度很长,令求和结果位数过多而导致数据溢出。所以这种解法很有局限性。
  2. 该题应该从链表的角度上去思考,这样就能避免由于位数过多而导致的数据溢出。需要考虑两个链表的长度问题,利用两个链表的指针同时平移,若某一指针下一个为空,则停止其移动,计算另一链表与进位的求和结果。
  3. 该题还有一个小细节就是进位的处理,我们可以设立一个进位元素,保存进位情况,每一次由两个链表对应节点元素与进位元素的求和作为当前步骤的值。
  4. 在leetcode中要记得排除对空指针的引用。

题目

原题链接
在这里插入图片描述

代码

/**
 * 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) {
        long long num1 = transform(l1);
        long long num2 = transform(l2);
        long long sum = num1+num2; 
        auto l3 = new ListNode();
        l3 = transback(sum);
        return l3;
    }

    long long transform(ListNode* l){
        long long tmp = 0;
        long long time = 0;
        while(l->next !=NULL){
            tmp = tmp + pow(10,time)*l->val;
            l = l->next;
            time++;
        }
        tmp = tmp+pow(10,time)*l->val; //会溢出
        return tmp;
    }

    ListNode* transback(long num){
        ListNode* root1 = new ListNode(num%10);
        num = num/10;
        ListNode* root2 = root1;
        
        while(num){
            ListNode* newnode =new ListNode(num%10);
            root1->next = newnode;
            num = num/10;
            root1 = root1->next;   
        }
        return root2;
    }

};
/*正确代码*/
/**
 * 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* res = new ListNode(-1);   //存放结果的指针
        ListNode* p = res;  //结果链表指针
        int sum=0;
        bool flag=false;
        while(l1!=NULL||l2!=NULL){//排除空指针的引用
            sum=0; 
            if(l1!=NULL){
                sum += l1->val;
                l1 = l1->next;
            }
            
            if(l2!=NULL){
                sum += l2->val;
                l2 = l2->next;
            }

            if(flag){
                sum++;
            }
            p->next = new ListNode(sum%10);
            flag = sum>=10?true:false;
            p = p->next;
        }
        if(flag)
            p->next = new ListNode(1);
        return res->next;
    }
};

可以调用pow(int x, int y)求x的y次幂
leetcode排除空指针的引用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值