给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头
如图所示:
解题思路,如果两个链表的长度都相等,那比较简单,直接加就可以了,难的是长度不相等,怎么处理这不相等情况,有一种方法是,将短的后面补零,再进行相加。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2)
{
bool carry=false;
struct ListNode* head;
head=(struct ListNode*)malloc(sizeof(struct ListNode));
struct ListNode* q1=l1;
struct ListNode* q2=l2;
int count1=1;
int count2=1;
while(q1->next)//计算q1链表的长度
{
count1++;
q1=q1->next;
}
while(q2->next)//计算q2链表的长度
{
count2++;
q2=q2->next;
}
if( count1>count2)//比较谁的长,谁短就在其后面补零
{
for(int i=1;i<=count1-count2;i++)
{
struct ListNode*new=(struct ListNode*)malloc(sizeof(struct ListNode));
new->val=0;
new->next=NULL;
q2->next=new;
q2=q2->next;
}
}
else
{
for(int j=1;j<=count2-count1;j++)
{
struct ListNode*new=(struct ListNode*)malloc(sizeof(struct ListNode));
new->val=0;
new->next=NULL;
q1->next=new;
q1=q1->next;
}
}
q1=l1;//由于q1和q2可能随着找尾移动了,所以得指向头节点
q2=l2;
struct ListNode*l3=head;
while(q1&&q2)
{
int sum=carry+q1->val+q2->val;
int singleDigits=sum%10;//去摸后的数据
carry=sum>=10?true:false;//如果大于零就carry就为真,反之为假
l3->next=(struct ListNode*)malloc(sizeof(struct ListNode));//开辟一个新的节点
l3=l3->next;//将l3l的next指向新开的节点
l3->val=singleDigits;//将值付给val
l3->next=NULL;
q1=q1->next;//重新更新q1
q2=q2->next;//重新更新q2
}
if(carry)//如果carry还有进位的话就在后面在加以为
{
l3->next=(struct ListNode*)malloc(sizeof(struct ListNode));
l3=l3->next;
l3->val=1;
l3->next=NULL;
}
return head->next;
}