《LeetCode力扣练习》第2题 C语言版 (做出来就行,别问我效率。。。。)

本文介绍了如何解决链表加法的问题,提供了三种不同的实现方案,包括直接模拟加法过程、转换为整数后再加以及利用itoa函数进行转换的方法,并分析了各种方法的优缺点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

库你急哇,哈集美马戏特~~

一顿操作猛如虎,一看击败百分五。。。。

老实人想先把两个链表转成整型加起来再转回去,结果被[1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1]教做人了

这里作者给出了3份代码,第一个为测试通过版,官方模拟了加法器;第2个为适用于数组长度较小时,逻辑简单,就是转换为整数进行运算;第3个为使用了itoa函数,使得转换更为简单,但是同样只适用长度较小。(测试样例太恶心了。。。。。。)

题目:

给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。

请你将两个数相加,并以相同形式返回一个表示和的链表。

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

示例 1:

输入:l1 = [2,4,3], l2 = [5,6,4]
输出:[7,0,8]
解释:342 + 465 = 807.

示例 2:

输入:l1 = [0], l2 = [0]
输出:[0]

示例 3:

输入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]
输出:[8,9,9,9,0,0,0,1]

提示:

每个链表中的节点数在范围 [1, 100] 内
0 <= Node.val <= 9
题目数据保证列表表示的数字不含前导零

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/add-two-numbers
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

上代码
第一份过OJ版

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>


struct ListNode {
     int val;
     struct ListNode *next;
};



struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2){

    struct ListNode *head=NULL,*p1=NULL;
    int carry=0;

    while(l1||l2)
    {
        int num1 = l1?l1->val:0;
        int num2 = l2?l2->val:0;
        int sum  =num1+num2+carry;

        if(!head)
        {
            p1=head=(struct ListNode *)malloc(sizeof(struct ListNode));
            p1->val=sum%10;
            p1->next=NULL;
        }
        else
        {
            p1->next=(struct ListNode *)malloc(sizeof(struct ListNode));
            p1=p1->next;
            p1->val=sum%10;
            p1->next=NULL;
        }

        carry=sum/10;

        if(l1)
        {
            l1=l1->next;
        }
        if(l2)
        {
            l2=l2->next;
        }
    }

    if(carry>0)
    {
        p1->next=(struct ListNode *)malloc(sizeof(struct ListNode));
        p1=p1->next;
        p1->val=carry;
        p1->next=NULL;
    }
    return head;

}

int main()
{
    struct ListNode *l1,*l2;
    struct ListNode *p1,*p2;
    int  n;

    p1=p2=(struct ListNode *)malloc(sizeof(struct ListNode));
    l1=p2;
    for(n=0;n<1;n++)
    {
      p1->val=0;
      p2->next=p1;
      p2=p1;
      p1=(struct ListNode *)malloc(sizeof(struct ListNode));
    }
    p2->next=NULL;


    p1=p2=(struct ListNode *)malloc(sizeof(struct ListNode));
    l2=p2;
    for(n=0;n<1;n++)
    {
        p1->val=0;
        p2->next=p1;
        p2=p1;
        p1=(struct ListNode*)malloc(sizeof(struct ListNode));
    }
    p2->next=NULL;

    struct ListNode *test=addTwoNumbers(l1,l2);
    while(test!=NULL)
    {
        printf("%d",test->val);
        test=test->next;
    }

    return 0;
}


第二份

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>


struct ListNode {
     int val;
     struct ListNode *next;
};



struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2){

    int num1=0,num2=0,sum=0;
    int n=0;
    struct ListNode *p1;

    p1=l1;
    while(p1!=NULL)
    {
        num1=num1+p1->val*(int) (pow(10,n)+0.5);
        p1=p1->next;
        n++;
    }

    p1=l2;
    n=0;
    while(p1!=NULL)
    {
        num2=num2+p1->val*(int)(pow(10,n)+0.5);
        p1=p1->next;
        n++;
    }

    sum=num1+num2;

    //判断底数是否为0,防止溢出
    if(sum==0)
    {
        struct ListNode *err=(struct ListNode*)malloc(sizeof(struct ListNode));
        err->val=0;
        err->next=NULL;
        return err;
    }


    int len=floor(log10(sum))+1;
    int nums[10];
    for(n=len-1;n>=0;n--)
    {
        nums[n]=sum/(int)(pow(10,n)+0.5);
        sum=sum-nums[n]*(int)(pow(10,n)+0.5);
    }

    struct ListNode *ret,*p2;
    p1=p2=(struct ListNode *)malloc(sizeof(struct ListNode));
    ret=p2;

    for(n=0;n<=len-1;n++)
    {
        p1->val=nums[n];
        p2->next=p1;
        p2=p1;
        p1=(struct ListNode *)malloc(sizeof(struct ListNode));
    }
    p2->next=NULL;

    return ret;

}

int main()
{
    struct ListNode *l1,*l2;
    struct ListNode *p1,*p2;
    int  n;

    p1=p2=(struct ListNode *)malloc(sizeof(struct ListNode));
    l1=p2;
    for(n=0;n<3;n++)
    {
      p1->val=0;
      p2->next=p1;
      p2=p1;
      p1=(struct ListNode *)malloc(sizeof(struct ListNode));
    }
    p2->next=NULL;


    p1=p2=(struct ListNode *)malloc(sizeof(struct ListNode));
    l2=p2;
    for(n=0;n<3;n++)
    {
        p1->val=0;
        p2->next=p1;
        p2=p1;
        p1=(struct ListNode*)malloc(sizeof(struct ListNode));
    }
    p2->next=NULL;

    struct ListNode *test=addTwoNumbers(l1,l2);
    while(test!=NULL)
    {
        printf("%d",test->val);
        test=test->next;
    }

    return 0;
}


第三份

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>


struct ListNode {
     int val;
     struct ListNode *next;
};



struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2){

    int num1=0,num2=0,sum=0;
    int n=0;
    struct ListNode *p1;

    p1=l1;
    while(p1!=NULL)
    {
        num1=num1+p1->val*(int) (pow(10,n)+0.5);
        p1=p1->next;
        n++;
    }

    p1=l2;
    n=0;
    while(p1!=NULL)
    {
        num2=num2+p1->val*(int)(pow(10,n)+0.5);
        p1=p1->next;
        n++;
    }

    sum=num1+num2;

    char nums[10];
    itoa(sum,nums,10);
    int len=strlen(nums);

    struct ListNode *ret,*p2;
    p1=p2=(struct ListNode *)malloc(sizeof(struct ListNode));
    ret=p2;

    for(n=len-1;n>=0;n--)
    {
        p1->val=(nums[n]-'0');
        p2->next=p1;
        p2=p1;
        p1=(struct ListNode *)malloc(sizeof(struct ListNode));
    }
    p2->next=NULL;

    return ret;

}

int main()
{
    struct ListNode *l1,*l2;
    struct ListNode *p1,*p2;
    int  n;

    p1=p2=(struct ListNode *)malloc(sizeof(struct ListNode));
    l1=p2;
    for(n=0;n<3;n++)
    {
      p1->val=n;
      p2->next=p1;
      p2=p1;
      p1=(struct ListNode *)malloc(sizeof(struct ListNode));
    }
    p2->next=NULL;


    p1=p2=(struct ListNode *)malloc(sizeof(struct ListNode));
    l2=p2;
    for(n=0;n<3;n++)
    {
        p1->val=n;
        p2->next=p1;
        p2=p1;
        p1=(struct ListNode*)malloc(sizeof(struct ListNode));
    }
    p2->next=NULL;

    struct ListNode *test=addTwoNumbers(l1,l2);
    while(test!=NULL)
    {
        printf("%d",test->val);
        test=test->next;
    }

    return 0;
}


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值