目录
题目描述:
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
思路:
设置两个指针分别指向两个链表的头结点,l1与l2
1.使用while循环来控制,判断条件为两个指针都指向NULL,while( l1 || l2 ),这里while循环中填的为继续的条件,所以为l1或l2。
2.分别是指三个参数,分别为n1,n2,a。n1与n2表示为两个链表结点数值。这个可能一个结点已经为空,所以要判断一下。当为NULL时赋值为0.
int n1=l1?l1->val:0;
int n2=l2?l2->val:0;
a为两个数相加的进位数。初始值赋值为0。
3.创建一个新链表来表示两数相加的结果,设置头尾结点,每一个结点都开辟空间,这里要注意是否为开辟的是头结点,使用if语句来判断。两数相加的结果用sum来表示,sum=n1+n2+a。因为可能有进位数的产生所以新结点的val值为sum%10。
struct ListNode *head,*tail;
head=tail=NULL;
int sum=n1+n2+a;
if(head==NULL)
{
head=tail=(struct ListNode*)malloc(sizeof(struct ListNode));
tail->val=sum%10;
tail->next=NULL;
}
else
{
tail->next=(struct ListNode*)malloc(sizeof(struct ListNode));
tail=tail->next;
tail->val=sum%10;
tail->next=NULL;
}
4.两个结点指针分别后移,要判断是够为空。
if(l1)
l1=l1->next;
if(l2)
l2=l2->next;
5.计算进制数a,a=sum/10。结束这次循环
6.有特殊情况要单独进行。当两个指针都为空时,但最后一位出现了进位,这里要单独进行结点开辟并进行赋值。判断条件为a是否大于0.
if(a>0)
{
tail->next=(struct ListNode*)malloc(struct ListNode);
tail=tail->next;
tail->val=a;
tail->next=NULL;
}
代码全部:
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2){
int a=0;
struct ListNode *head,*tail;
head=tail=NULL;
while(l1||l2)
{
int n1=l1?l1->val:0;
int n2=l2?l2->val:0;
int sum=n1+n2+a;
if(head==NULL)
{
head=tail=(struct ListNode*)malloc(sizeof(struct ListNode));
tail->val=sum%10;
tail->next=NULL;
}
else
{
tail->next=(struct ListNode*)malloc(sizeof(struct ListNode));
tail=tail->next;
tail->val=sum%10;
tail->next=NULL;
}
if(l1)
l1=l1->next;
if(l2)
l2=l2->next;
a=sum/10;
}
if(a>0)
{
tail->next=(struct ListNode*)malloc(sizeof(struct ListNode));
tail=tail->next;
tail->val=a;
tail->next=NULL;
}
return head;
}