一、题目
给定两个非空链表来表示两个非负整数。位数按照逆序方式存储,它们的每个节点只存储单个数字。将两数相加返回一个新的链表。
你可以假设除了数字 0 之外,这两个数字都不会以零开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4) 输出:7 -> 0 -> 8 原因:342 + 465 = 807
二、初次的暴力解答(C)
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2)
{
struct ListNode* ret=(struct ListNode*)malloc(sizeof(struct ListNode));
ret->next=NULL;
int jinwei = 0;
struct ListNode *p=l1->next;
struct ListNode *q=l2->next;
ret->val=(l1->val+l2->val)%10;
jinwei=(int)(l1->val+l2->val)/10;
struct ListNode* n=ret;
while(p!=NULL && q!=NULL)
{
struct ListNode *ss=(struct ListNode*)malloc(sizeof(struct ListNode));
ss->next=NULL;
ss->val=(p->val+q->val+jinwei)%10;
jinwei=(int)(p->val+q->val+jinwei)/10;
n->next=ss;
n=n->next;
p=p->next;
q=q->next;
}
if(p==NULL && q==NULL && jinwei==1)
{
struct ListNode *ss=(struct ListNode*)malloc(sizeof(struct ListNode));
ss->next=NULL;
ss->val=1;
n->next=ss;
n=n->next;
}
if(p!=NULL || q!=NULL)
{
if(p!=NULL)
{
if(jinwei == 1)
{
struct ListNode* p1=p;
while(p1->val==9 && p1!=NULL && p1->next!=NULL)
{
p1->val=0;
p1=p1->next;
}
if(p1->val==9)
{
p1->val=0;
struct ListNode *ss=(struct ListNode*)malloc(sizeof(struct ListNode));
ss->next=NULL;
ss->val=1;
p1->next=ss;
}
else
{
p1->val++;
}
}
n->next=p;
}
if(q!=NULL)
{
if(jinwei == 1)
{
struct ListNode* q1=q;
while(q1->val==9 && q1!=NULL && q1->next!=NULL)
{
q1->val=0;
q1=q1->next;
}
if(q1->val==9)
{
q1->val=0;
struct ListNode *ss=(struct ListNode*)malloc(sizeof(struct ListNode));
ss->next=NULL;
ss->val=1;
q1->next=ss;
}
else
{
q1->val++;
}
}
n->next=q;
}
}
return ret;
}
初次解答反思和总结:
1.一直有拆东墙补西墙的感觉,对于特殊情况考虑不周,没有很好的把握,在以后刷题中应多加注意留心!!切记。
2.在LeetCode刷题中声明结构体变量时在变量名前应加上struct。
3.一定要理清思路!!理清思路后再码代码,要不然会搞的代码一团糟。
二、别人家的代码
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2) {
struct ListNode *p1=l1;
struct ListNode *p2=l2;
struct ListNode *result=(struct ListNode *)malloc(sizeof(struct ListNode));
result->val=0;
struct ListNode *p=NULL;
int c=0;
while (p1!=NULL || p2!=NULL || c!=0)
{
if(p == NULL)
{
p=result;
}
else
{
p->next=(struct ListNode*)malloc(sizeof(struct ListNode)); //这里写成p会出错
p->next->val=0;
p=p->next;
}
int a=(p1==NULL ? 0:p1->val);
int b=(p2==NULL ? 0:p2->val);
int s=(a+b+c)%10;
c=(a+b+c)/10;
p->val=s;
p->next=NULL;
p1=(p1==NULL ? NULL : p1->next);
p2=(p2==NULL ? NULL : p2->next);
}
return result;
}
别人家的代码总结:
思路清晰,简单易懂。多家学习,看看别人的代码,真是没脸见人了。