首先要思考该怎样将每个数逐个存入到新链表呢?这里有两种思路。第一是将链表12中的数字取出并不断乘10并最后相加以获得链表12所表示的数字之和,然后再不断取模将各位数字反序存入到新链表中(这里在LeetCode中行不通,由于其中部分测试数据太大,会导致整型溢出);第二则是每层链表的数字相加,然后进位加1,这也是接下来我的解题思路。
第一在考虑如果输入不齐的链表时,在相加时不足位要用“0”补齐(这里并不是往链表添加0,只是输出时不在访问该链表,而是直接输出0)
第二考虑进位问题,如果同层的数据相加>=10,下一层数据相加时就再加上1,否则加上0
第三就是我思考良久的问题了,当最后一次运算时发生了进位,那么就要重新创建一个新的节点,否则会少存入一个数据
来看我的代码
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2)
{
struct ListNode* h=NULL,* n=NULL,*e=NULL;
long long int x=1,k=0,count=0,i=0,sum=0;
h=( struct ListNode*)malloc(sizeof(struct ListNode));
e=h;
while(l1||l2)//当l1,l2同时访问到空指针时就停止循环
{
long int n1=(l1==NULL?0:l1->val);//如果l1先访问到了空指针,就直接将0赋值给n1,l2同理
long int n2=(l2==NULL?0:l2->val);
if(l1!=NULL)//该条件的设立是为了防止l1访问到了空指针后还要往下层走导致报错,l2同理
l1=l1->next;
if(l2!=NULL)
l2=l2->next;
sum=n1+n2+k;
k=(sum>=10?1:0);//判断下一次运算是否进位
x=sum%10;//将取模后的值存入链表中,避免存入两位数
n=(struct ListNode*)malloc(sizeof(struct ListNode));
n->val=x;
e->next=n;
e=n;
}
if( sum>=10)//如果发生了进位,就重新创建一个节点,当然也要与上一个节点相连
{
n=(struct ListNode*)malloc(sizeof(struct ListNode));
n->val=1;
e->next=n;
e=n;
}
e->next=NULL;
return h->next;//由于数据从头结点的下一个节点才开始录入,故也应该从该节点开始读取
}
当然如果有兴趣的话也可以来看看第一种思路的代码
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2)
{
struct ListNode* h=NULL,* n=NULL,*e=NULL;
long long int x=1,k=0,count=0,i=0,sum=0;
h=( struct ListNode*)malloc(sizeof(struct ListNode));
e=h;
while(l1||l2)
{
long int n1=(l1==NULL?0:l1->val);
long int n2=(l2==NULL?0:l2->val);
if(l1!=NULL)
l1=l1->next;
if(l2!=NULL)
l2=l2->next;
sum+=(n1+n2)*x;
x=10*x;//就是这里,如果输入数据太大,x由于是10的N次方,即便是long long int也存不下,当然如果数据小一些,该思路也是没问题的啦
count++;
}
if( sum==0)
{
for( int i=0;i< count;i++)
{
n=(struct ListNode*)malloc(sizeof(struct ListNode));
n->val=0;
e->next=n;
e=n;
}
}
else if(sum!=0)
{
while(sum!=0)
{
k=sum%10;
sum=sum/10;
n=(struct ListNode*)malloc(sizeof(struct ListNode));
n->val=k;
e->next=n;
e=n;
}
}
e->next=NULL;
return h->next;
}