给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。请你将两个数相加,并以相同形式返回一个表示和的链表。你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
输入:l1 = [2,4,3], l2 = [5,6,4] 输出:[7,0,8] 解释:342 + 465 = 807. 分析:用除法和取余可以得到结果和是否进位,用尾插法得到新链表
尾插法:就是顺序插入,不断将尾指针置于表尾。输入123,得到的也是123
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2){
int pos=0;//查看是否产生进位,初始值为0,若没有进位则为0,反之为1;
struct ListNode* head=NULL,*tail=NULL;//设置头指针和尾指针,
便于将后序产生的结果连接到链表里面
while(l1||l2){//进入循环,最终循环停止的条件是两个链表都到末尾
int s1=l1!=NULL?l1->val:0;//定义s1为当前l1的值,若l1为空,则为0
int s2=l2!=NULL?l2->val:0;
int sum=s1+s2+pos;//计算当前l1和l2加上进位数pos的总和
if(head==NULL){//
head=tail=(struct ListNode*)malloc(sizeof(struct ListNode));
tail->val=sum%10; //%取余,得到一位结果
pos=sum/10; //除号判断是否产生进位
tail->next=NULL;
}
else{
struct ListNode* x=(struct ListNode*)malloc(sizeof(struct ListNode));
x->val=sum%10;
pos=sum/10;
x->next=tail->next;//使用尾插法
tail->next=x;
tail=x;
}
if(l1!=NULL)//l1不为空,链接到下一节点
l1=l1->next;
if(l2!=NULL)//l2不为空,链接到下一节点
l2=l2->next;
}
// 判断两链表加完之后是否有进位,有则需要创建节点存放进位数,并置于新的链表尾
if(pos==1){
struct ListNode* x=(struct ListNode*)malloc(sizeof(struct ListNode));
x->val=pos%10;
x->next=tail->next;
tail->next=x;
tail=x;
}
return head;
}