错误示范:
开始的时候,我想的比较简单,就输入的时候直接倒转得到数n1,同理得n2,
然后相加得n后,取余尾插法就逆转数字了,如下:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2) {
long int n1=0,n2=0,n=0;
int count=0,r=0;
struct ListNode *l,*p,*q;
while(l1!=NULL)
{
n1=(l1->val)*pow(10,count)+n1;
count++;
l1=l1->next;
}//l1是243,n1是342
count=0;
while(l2!=NULL)
{
n2=(l2->val)*pow(10,count)+n2;
count++;
l2=l2->next;
}
n=n1+n2;//n=807
q=(struct ListNode*)malloc(sizeof(struct ListNode));
r=n%10;n=n/10;
q->val=r;
l=q;
p=q;
while(n>0)
{
q=(struct ListNode*)malloc(sizeof(struct ListNode));
r=n%10;n=n/10;
q->val=r;
p->next=q;
p=q;
}
p->next=NULL;
return l;//l=708
}
调试也OK了,调试的时候报错:
点进去看了一下:
好吧= = 原来输入的数字这么长……long int 也存不下,那只能链表里直接相加了,后来想想其实直接相加更方便。
正确如下:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2) {
int flag=0,n=0;//n记录当前位两个数相加,flag表示进位
struct ListNode *head,*p,*q;
q=(struct ListNode*)malloc(sizeof(struct ListNode));
n=l1->val+l2->val;
if(n>=10)
{
flag=1;n=n%10;
}
q->val=n;
head=q;p=q;
l1=l1->next;l2=l2->next;
while(l1!=NULL&&l2!=NULL)
{
q=(struct ListNode*)malloc(sizeof(struct ListNode));
if(flag==1)
{
n=l1->val+l2->val+flag;flag=0;
}
else
{
n=l1->val+l2->val;
}
if(n>=10)
{
flag=1;n=n%10;
}
q->val=n;
p->next=q;
p=q;
l1=l1->next;
l2=l2->next;
}
while(l1!=NULL&&l2==NULL)
{
q=(struct ListNode*)malloc(sizeof(struct ListNode));
if(flag==1)
{
n=l1->val+flag;flag=0;
}
else
{
n=l1->val;
}
if(n>=10)
{
flag=1;n=n%10;
}
q->val=n;
p->next=q;
p=q;
l1=l1->next;
}
while(l2!=NULL&&l1==NULL)
{
q=(struct ListNode*)malloc(sizeof(struct ListNode));
if(flag==1)
{
n=l2->val+flag;flag=0;
}
else
{
n=l2->val;
}
if(n>=10)
{
flag=1;n=n%10;
}
q->val=n;
p->next=q;
p=q;
l2=l2->next;
}
if(l1==NULL&&l2==NULL&&flag==1)
{
q=(struct ListNode*)malloc(sizeof(struct ListNode));
q->val=1;
p->next=q;
p=q;
flag=0;
}
p->next=NULL;
return head;
}
于是通过了~~
优化:
不过后来仔细琢磨了 一下:
因为每次都需要判断
if(flag==1) //就是有没有进位,有是1,没有是0
然后在同位相加的时候还要都为下一次提供判断,是否有进位
if(n>=10)
其实可以直接每次用这两句,而不用再循环:
n=(l1->val+l2->val+flag)%10;
flag=(1->val+l2->val+flag)/10;