letcode2-两数之和(内存击败100%用户*_*)

题目:

给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。

如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。

您可以假设除了数字 0 之外,这两个数都不会以 0 开头。

示例:

输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/add-two-numbers

解答:

第一次提交代码,炫耀一下,内存击败100%用户哦(第一题是两年前提交的)

第一种解题思路如下:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */

struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2)
{
    int sum = 0;
    int flag = 0;
    int flag1 = 0;//用于判断l1是否为空
    int flag2 = 0;//用于判断l2是否为空
    int a,b;      //储存结构val临时变量

    struct ListNode* retL = (struct ListNode*)malloc(sizeof(struct ListNode));    
    struct ListNode* tmpL = retL;
    while(NULL != l1 || NULL != l2 || flag != 0)// flag进位判断必须加上,例如[5] [5]会出错
    {
        //a = NULL == l1 ? (a = 0, flag1 = 1) : l1->val; //会导致计算出错,有兴趣的可以试一下
        if(NULL == l1)//这地方本来想用三目运算符,不知怎么改,flag比较难赋值
        {
            a = 0;
            flag1 = 1;
        }
        else
            a = l1->val;
        if(NULL == l2)
        {
            b = 0;
            flag2 = 1;
        }
        else
            b = l2->val;

        sum = a + b + flag;
        flag = sum > 9 ? 1 : 0;
        sum = sum % 10;

        l1 = flag1 ? NULL : l1->next;// l1 = l1->next == NULL ? NULL : l1->next; 会段错误
        l2 = flag2 ? NULL : l2->next;

        struct ListNode* L = (struct ListNode*)malloc(sizeof(struct ListNode));
        if(NULL == L)
        {
            printf("malloc fail!\n");
            exit(-1);
        }

        L->val = sum;
        tmpL->next = L;
        tmpL = L;
    }

    tmpL->next = NULL;

    return retL->next;
}

 

下边还有另外一种失败的解题思路,有兴趣的可以看看。

自己的方案,发现有问题,修改到这种程度已经修改不下去了,sum改为long long型总有会溢出的时候,说明此路不通,只能换方法了。

/**
 * Definition for singly-linked list.
struct ListNode {
     int val;
     struct ListNode *next;
};

*/
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2)
{
    unsigned long long sum = 0;
    int i = 1;
    while(NULL != l1)
    {
        sum += l1->val * i;
        i = i * 10;
        l1 = l1->next;//注意下次循环,第一次提交死循环超时(没有加这条语句)
    }
    printf("sum:%d\n",sum);

    i = 1;
    while(NULL != l2)
    {
        sum += l2->val * i;
        i = i * 10;
        l2 = l2->next;
    }
    printf("sum:%d\n",sum);

    struct ListNode* retL = (struct ListNode*)malloc(sizeof(struct ListNode));
    if(NULL == retL)
    {
        printf("malloc fail!\n");
        exit(-1);
    }
    
    struct ListNode* tmpL = retL;
    //for( ;sum != 0; sum = sum / 10 )//不能使用for循环,[0], [0].用例通不过,考虑不周
   do 

   {
        struct ListNode* L = (struct ListNode*)malloc(sizeof(struct ListNode));
        if(NULL == L)
        {
            printf("malloc fail!\n");
            exit(-1);
        }

        L->val = sum % 10;
        tmpL->next = L;
        tmpL = L;

        sum = sum / 10;
    }while(sum != 0);

    tmpL->next = NULL;//必须加上,不然会报错,指针未赋值,会造成野指针

    return retL->next;
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值