一开始我把这道题复杂化了,我想着通过逆序链表输出两条链表的值,再将两个链表的值相加之后再将这个值储存
但其实问题不用这么麻烦,只需要简单的对同一位置的链表元素相加,当相加结果大于9时再进位就行
需要考虑三种情况:
1.两条链表长度一样:用新节点直接将相加后的值存储起来(考虑进位)
2.两条链表长度不一样:用新节点直接将不等长的节点数值存储起来(考虑进位)
3.合成的数长度比原来两条链表都要大:即进位,直接存1即可
代码如下
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
//写题思路:将两个链表的节点相加,列入新链表中
//若出现进位,则在下一位的节点加一
typedef struct ListNode* list;
typedef struct ListNode node;
list creat(int n,int flag)
{
list new=malloc(sizeof(node));
new->val=n;
new->next=NULL;
return new;
}
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2){
list head,p;
head=creat(0,0);
p=head;
int n=0;
int flag=0;
while(l1&&l2)//当两条链表都不为空时
{
n=l1->val+l2->val+flag;
if(n>=10)
{
n-=10;
p->next=creat(n,flag);
p=p->next;
flag=1;
}
else
{
p->next=creat(n,flag);
p=p->next;
flag=0;
}
l1=l1->next;
l2=l2->next;
}
while(l1)//若l2空了l1没空
{
n=l1->val+flag;
if(n>=10)
{
n-=10;
p->next=creat(n,flag);
p=p->next;
flag=1;
}
else
{
p->next=creat(n,flag);
p=p->next;
flag=0;
}
l1=l1->next;
}
while(l2)//若l1空了l2没空
{
n=l2->val+flag;
if(n>=10)
{
n-=10;
p->next=creat(n,flag);
p=p->next;
flag=1;
}
else
{
p->next=creat(n,flag);
p=p->next;
flag=0;
}
l2=l2->next;
}
if(flag==1)//若l1 l2都空了但是进位了
{
p->next=creat(1,0);
p=p->next;
}
return head->next;
}