每日一题(LeetCode)----链表--两数相加

每日一题(LeetCode)----链表–两数相加

1.题目(2. 两数相加

  • 给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。

    请你将两个数相加,并以相同形式返回一个表示和的链表。

    你可以假设除了数字 0 之外,这两个数都不会以 0 开头。

    示例 1:

    img

    输入:l1 = [2,4,3], l2 = [5,6,4]
    输出:[7,0,8]
    解释:342 + 465 = 807.
    

    示例 2:

    输入:l1 = [0], l2 = [0]
    输出:[0]
    

    示例 3:

    输入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]
    输出:[8,9,9,9,0,0,0,1]
    

    提示:

    • 每个链表中的节点数在范围 [1, 100]
    • 0 <= Node.val <= 9
    • 题目数据保证列表表示的数字不含前导零

2.解题思路

思路一

循环

1.先获取两个链表的长度,然后把较长链表作为我们的结果链表 2.创建一个记录进位的变量,用两个指针从头开始遍历两个链表每次遍历到的节点如果非空,那么把当前节点中的值和当前进位进行相加,如果和大于10,那么下一次的进位变为1,然后和减10,存到结果链表的对应节点中,一直遍历直到遍历完较长链表时结束,(为了之后我们添加新节点,所以遍历到较长链表的结尾时,我们用tail指针保存一下较长链表的结尾) 3.然后我们查看当前进位是否为0,如果不为零,那我们新创建一个节点,接到结果链表的后面操作结束,如果为零,那么不需要新创建一个节点,操作结束 4.返回新链表的头节点

思路二:递归

递归解法非常巧妙。

做递归题目一定要牢记「递归函数的定义」。

递归函数定义:addTwoNumbers 表示将两个链表 l1 和 l2 相加得到的新链表; 递归终止条件:如果 l1 和 l2 有一个为空,则返回另外一个。 递归函数内容:

把两个链表节点的值相加(结果记为 add )。把 add 模 10 作为当前的链表节点的值。
把两个链表的 next 节点相加。(注意:如果当前相加的结果 add>=10,需要把 next 节点相加得到的结果 + 1。)
递归解法妙在天然地处理好了两个链表不一样长、最终相加结果有进位的情况。

原作者:负雪明烛
链接:https://leetcode.cn/problems/add-two-numbers/

自己的理解:就是先从前到后先走一遍,算出所有的和作为答案,然后从后往前看有哪个和超过了10,超过了10就继续向后递归,但是递归的对象变为当前进位和它的下一位和,到了递归的终止条件之后,就继续向前返回

3.写出代码

思路一的代码
class Solution {
public:
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
        //先获取两个链表的长度
        int length1=0;
        int length2=0;
        ListNode* Temp1=l1;
        ListNode* Temp2=l2;
        int length=0;
        while(Temp1){
            length1++;
            Temp1=Temp1->next;
        }
        while(Temp2){
            length2++;
            Temp2=Temp2->next;
        }
        //判断那个链表长作为我们的结果链表
        ListNode* res1=nullptr;
        ListNode* res2=nullptr;
        if(length1>=length2){
            length=length1;
            res1=l1;
            res2=l2;
        }
        else{
            length=length2;
            res1=l2;
            res2=l1;
        }
        Temp1=res1;
        Temp2=res2;
        int carry=0;//记录进位的变量
        ListNode* Temp3=nullptr;//存的是较长链表的最后一个节点
        //两个链表对应的节点进行相加
        while(length--){
            int sum=0;
            if(Temp1&&Temp2){
                sum=Temp1->val+Temp2->val+carry;
            }
            else{
                sum=Temp1->val+carry;
            }
            carry=0;
            if(sum>=10){
                carry++;
                sum=sum-10;
                Temp1->val=sum;
            }
            else{
                Temp1->val=sum;
            }
            if(Temp1->next==nullptr){
                Temp3=Temp1;
            }
            Temp1=Temp1->next;
            if(Temp2){
                Temp2=Temp2->next;
            }
        }
        if(carry>0){
                ListNode* node=new ListNode(carry);
                Temp3->next=node;
                }
        return res1;
    }
};
思路二的代码
class Solution {
public:
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
        if (!l1) return l2;
        if (!l2) return l1;
        int target = l1->val + l2->val;
        ListNode* res = new ListNode(target % 10);
        res->next = addTwoNumbers(l1->next, l2->next);

        if (target >= 10){
            res->next = addTwoNumbers(res->next, new ListNode(1));
        }
        
        delete l1, l2;
        return res;
    }
};
原作者:负雪明烛
链接:https://leetcode.cn/problems/add-two-numbers/
  • 7
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序小白的code之路(记录分享)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值