题目链接:
分析:这个题目和之前所做的数组求和问题大同小异,只不过增加了链表的情景,需要大家考虑链表中可能出现的情况而已,有兴趣的同学可以先看这个链接,实现了二进制的模拟求和,这个熟练以后再来看链表场景下的,效果会更好。LeetCode67. 二进制求和-CSDN博客
算法思路:设置一个结果链表,然后我们遍历题目中给出的两个链表,每次从链表中取出结点然后求和,再将和存入到结果链表中。在两个链表其中一个结束以后,我们再判断另一个不为空的链表,同样重复这个过程直到链表循环结束。要注意的是最后要判断进位是否为1,如果为1还需要再插入一个结点表示进位的情况;同时为了方便,建议使用尾插法,这样可以一次性返回正确的结果。具体大家可以看参考代码,注释写的也比较详细了。
参考代码
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
ListNode* head=new ListNode(-1);//建立一个临时头结点 方便返回最后的结果
ListNode* cur=head;//这里使用尾插法较好 可以直接返回正确结果 所以我们设置一个结点表示现在所到的位置
int temp=0;//表示进位符的值
while(l1&&l2){//开始遍历两个链表
ListNode* p=new ListNode(-1);//新设置一个结点,存储该位求和的值并添加到结果链表中
cur->next=p;
cur=p;
int a=l1->val,b=l2->val;//取出两个链表中的整数
if(a+b+temp<10){//不存在进位的情况
p->val=a+b+temp;
temp=0;
}else{//存在进位的情况
p->val=(a+b+temp-10);
temp=1;
}
l1=l1->next;//两个结点各自向后移动
l2=l2->next;
}//遍历结束后,可能存在两个链表中还有一个没有结束 所以我们继续遍历没有结束的那个
while(l1){//遍历l1 思路同上
ListNode* p=new ListNode(-1);
cur->next=p;
cur=p;
int a=l1->val;
if(a+temp<10){
p->val=a+temp;
temp=0;
}else{
p->val=(a+temp-10);
temp=1;
}
l1=l1->next;
}
while(l2){//遍历l2 思路也同上
ListNode* p=new ListNode(-1);
cur->next=p;
cur=p;
int a=l2->val;
if(a+temp<10){
p->val=a+temp;
temp=0;
}else{
p->val=(a+temp-10);
temp=1;
}
l2=l2->next;
}
if(temp!=0){//两个链表都遍历结束后,还要继续判断进位是否为空,不为空则新开一位表示最高位的值
ListNode* p=new ListNode(-1);
cur->next=p;
cur=p;
p->val=1;
}
return head->next;//head为临时头结点,所以我们需要返回头结点的下一个结点
}
};