/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
//进位
//改善-->直接在原链表上加:将短链表的值加到新链表上
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2){
struct ListNode *head=NULL,*tail=NULL;
int carry=0;//进位
//当二者全部遍历完,结束
while(l1 || l2)
{
//当链表长度不同时,短的那个链表后面默认为0
int n1= l1?l1->val:0;
int n2=l2?l2->val:0;
int sum=n1+n2+carry;
if(!head)//当其为头节点时
{
head = tail=malloc(sizeof(struct ListNode));//初始化
tail->val=sum %10;//进位
tail->next=NULL;
}
else//当不为头节点时
{
tail->next=malloc(sizeof(struct ListNode));
tail->next->val=sum%10;//进位
tail=tail->next;
tail->next=NULL;
}
// 计算进位,为下一次计算做准备
carry = sum/10;
//移动两个链表指针的位置
if(l1)
{
l1=l1->next;
}
if(l2)
{
l2=l2->next;
}
}
//当计算到最长链表的最后一个位置时,判断是否有最高位进位
if(carry>0)
{
tail->next=malloc(sizeof(struct ListNode));
tail->next->val=carry;
tail->next->next=NULL;
}
return head;
}