LeetCode2.两数相加

题目链接:

2. 两数相加 - 力扣(LeetCode)

分析:这个题目和之前所做的数组求和问题大同小异,只不过增加了链表的情景,需要大家考虑链表中可能出现的情况而已,有兴趣的同学可以先看这个链接,实现了二进制的模拟求和,这个熟练以后再来看链表场景下的,效果会更好。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为临时头结点,所以我们需要返回头结点的下一个结点
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值