题目不难,有很多种解题思路,我基础不怎么好,为了提高单链表操作的熟练度用了最基础的方法。如果是存在l1/l2链表中,需要注意断链的问题,以及个别数据的更新,可能会出现覆盖掉旧值的情况。也可以讲其转换为数字,相加后再用头插法去处理。
代码如下:
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2){//将结果存在l1中
struct ListNode *p=l1,*q,*pre=NULL;
int tmp=0,sum;
while(l1&&l2){
sum=(l1->val+l2->val+tmp)%10;//踩坑*1——必须用临时变量暂存,更新完进位之后再赋值
tmp=(l1->val+l2->val+tmp)/10;
l1->val=sum;
pre=l1;
l1=l1->next;
l2=l2->next;
}
if(l2) pre->next=l2,l1=l2,l2=NULL;//踩坑*2 统一用l1表示后,将l2置空,以便最后新增进位结点的判断
if(l1&&tmp)//后两个if语句,如有进位则需继续运算,反之运算结束
while(l1){
sum=(l1->val+tmp)%10;
tmp=(l1->val+tmp)/10;
l1->val=sum;
pre=l1;
l1=l1->next;
}
if(!l1&&!l2&&tmp==1){//新增进位结点
q=(struct ListNode*)malloc(sizeof(struct ListNode));
q->val=1,q->next=NULL;
pre->next=q;
}
return p;
}