库你急哇,哈集美马戏特~~
一顿操作猛如虎,一看击败百分五。。。。
老实人想先把两个链表转成整型加起来再转回去,结果被[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;
}