2.两数相加-力扣(PS:两个小时才通过全部测试,第一种方法通过99%的测试用例)
这道题目虽然看着难度不大,但是我写了两个多小时才通过测试!PS:不经常刷算法,手会生的。
题目描述:
下面是我的翻车之作,编译数次后发现问题。
/** 6. Definition for singly-linked list. 7. struct ListNode { 8. int val; 9. struct ListNode *next; 10. }; */
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2){
struct ListNode *temp,*p,*rear;
struct ListNode *result,*ptr;
result=(struct ListNode *)malloc(sizeof(struct ListNode));
result->next=NULL;//初始化头节点指向的下一个地址为NULL
rear=result;//未创建其他节点之前,只有一个头节点
long int sum=0,t=1;
//p=result;
while(l1)
{
sum+=l1->val*t;
t*=10;
l1=l1->next;
}
t=1;
while(l2)
{
sum+=l2->val*t;
t*=10;
l2=l2->next;
}
if(sum==0){
result->val=0;
return result;
}
while(sum>0)
{
temp=(struct ListNode*)malloc(sizeof(struct ListNode));
//temp->next=NULL;
temp->val=sum%10;
sum=sum/10;
rear->next=temp;
rear=temp;
}
rear->next=NULL;
ptr=result;
result=ptr->next;
return result;
}
此代码是用另一种思路来实现:首先将两个链表的数值相加得到总和,然后再利用尾插法将总和以链表的形式存储。
遇到的问题:
1. 忘记尾插法。
2. 得到新的链表后发现多了一个头指针。
3. 以上全部解决完后,发现当两个链表全为空时不行。
4. 最后发现,当数特别大时用long int也没法计算。
以上代码适用于80%以上的测试用例。
100%测试用例 题目代码:
/** 1. Definition for singly-linked list. 2. struct ListNode { 3. int val; 4. struct ListNode *next; 5. }; */
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2){
struct ListNode *new1,*p3;
struct ListNode *result;
result=(struct ListNode *)malloc(sizeof(struct ListNode));
result->next=NULL;//这里很重要,定义了指针以后,要把它的next赋成NULL,否则会编译出错
int sum=0;
p3=result;
while(1)
{
if(l1)
{
sum+=l1->val;
l1=l1->next;
}
if(l2)
{
sum+=l2->val;
l2=l2->next;
}
p3->val=sum%10;
sum=sum/10;
if(l1 || l2 || sum!=0)//当l1不为空或l2不为空或sum不为0时,循环继续
{
new1=(struct ListNode *)malloc(sizeof(struct ListNode));
new1->next=NULL;//这里很重要,定义了指针以后,要把它的next赋成NULL,否则会编译出错
p3->next=new1;
p3=p3->next;
}
else break;//否则跳出循环得到结果
}
return result;
}