[LeetCode]两数相加

news2024/10/6 22:32:51

  • 解题 思路1 :
  •  先将每个链表的节点数求出来,将短的链表的每个节点的值加到长链表对应的节点上,在判断加上之后的值是否大于10,若大于则该节点减10,下一个节点加1,由此循环之后,只有长链表的最后一个节点的数可能大于10,则对最后一个节点进行判断,如果大于10,则new一个新的节点,将该节点值对10求商的值传入,该节点的值变为对10求余的数
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
        // 拿到两个链表各自的长度
        ListNode* head1 = l1;
        int n1 = 0, n2 = 0; // 节点个数
        while (head1 != nullptr) {
            n1++; // 个数
            head1 = head1->next;
        }
        head1 = l2;
        while (head1 != nullptr) {
            n2++; // 个数
            head1 = head1->next;
        }
        ListNode* h_max = n1 >= n2 ? l1 : l2; // 拿到较长链表
        ListNode* h_min = n1 < n2 ? l1 : l2;  // 拿到较短链表

        // 将短链表每个节点的值加到长链表节点
        while (h_min != nullptr) {
            h_max->val += h_min->val;
            h_min = h_min->next;
            h_max = h_max->next;
        }
        
        h_max = n1 >= n2 ? l1 : l2; // 头节点置初始位置

        // 求最终的长链表
        ListNode* cur = h_max; // 存一份h_max
        while (h_max != nullptr) {
            // 若当前节点的值大于等于10
            if (h_max->val >= 10) {
                if (h_max->next == nullptr) {
                    h_max->next = new ListNode(h_max->val / 10);
                } else {
                    h_max->next->val += h_max->val / 10;
                }
                h_max->val %= 10;
            }
            h_max = h_max->next;
        }

        return cur;
    }
};

解题 思路 2:

  • 递归法 :
    • 递归终止条件为l1,l2都为空,如果进位carry的值不等于0,则会创建一个新的节点保存这个进位,否则返回值为空
    • 如果l1为空,则l2一定不会为空,如果为空,则在递归终止条件处就终止返回了,然后如果l1==nullptr,则会交换l1,l2的值,保证l1是一个长的链表,
    • 在将l1,l2节点的值和进位carrry相加,在该节点保存的值为carry%10,然后继续递归,传进去的carry为carry/10
    • 最后返回l1链表
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2,int carry = 0) {
        // int carry = 0;//进位
        if(l1 == nullptr && l2 == nullptr)
            return carry ?new ListNode(carry) : nullptr;

        if(l1 == nullptr) //如果l1为空 则l2一定不会为空
            swap(l1,l2);//交换l1,l2,保证l1非空

        carry +=l1->val +(l2 ?l2->val:0);//节点值和进位值加在一起

        l1->val = carry %10;//每个节点保存一个位数

        l1->next = addTwoNumbers(l1->next,(l2?l2->next:nullptr),carry/10);

        return l1;
    }
};

解题 思路3 :

  • 迭代
  • 大致思路是创建一个新的链表,建立哨兵节点,用于开始指向下一个节点,将这两个链表每个节点的值和进位值相加经求余后得到该节点应该存放的值,如果l1,l2 或者carry有一个不为零,则一直循环,最后输出dummy->next
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {

        //迭代
        auto dummy = new ListNode();//创建一个空链表

        auto cur = dummy;
        int carry = 0 ;//保存进位

        while(l1 || l2 || carry){
            carry +=(l1?l1->val:0)+(l2?l2->val:0);
            cur ->next = new ListNode(carry %10);//每个节点保存一位数
            cur = cur -> next;
            carry /=10;//新的进位

            //下一个节点
            if(l1) l1 = l1 ->next;
            if(l2) l2 = l2 ->next;
        }
        //哨兵节点的下一个节点就是头节点
        return dummy->next;
    }
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/891874.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

videojs 播放视频

背景&#xff1a;在项目中使用第三方插件videojs进行播放视频&#xff0c;点击事件更改播放的数据源。 一、视频相关理论 (一)、背景 网络流媒体的呈现形式分为两种&#xff1a;直播点播 (二)、流媒体的3种协议 分类&#xff1a;HTTPHLSRTMP定义&#xff1a;基于HTTP的流媒体…

踩坑串口通信 serialPort.RtsEnable = true

背景&#xff1a; 最近在调试一个激光模块&#xff0c;使用的是422通信&#xff0c;然后买了一个485转422的转换器。 通过串口监控软件观察&#xff0c;明明和串口助手发的东西一模一样&#xff0c;但是就是不返回&#xff01; 解决方案&#xff1a; 我加了&#xff0c;这句&…

2023年最新国内八款低代码平台盘点,国内低代码是否已经跑出独角兽?

什么是低代码平台&#xff1f;低代码平台的优势在哪里&#xff1f;低代码平台是否已经形成了自己的核心竞争力&#xff1f;低代码平台是否在国内跑出独角兽&#xff1f;本篇&#xff0c;我们将一起针对上述问题深入浅出的分析低代码平台的特点和前景&#xff0c;并且为大家盘点…

【推荐】深入浅出学习Spring框架【中】

目录 1.AOP是什么? 2.案列&#xff1a; 3.spring的aop的专业术语 4.代码模拟 4.1 前置通知 3.2.后置通知 3.3.环绕通知 3.4.异常通知 3.5.过滤通知 1.AOP是什么? 面向切面编程&#xff08;Aspect-Oriented Programming&#xff09;是一种编程范式&#xff0c;它的主要…

Python面向对象版本贪吃蛇实现

先来一波效果图吧 看看如何设计代码实现 import random import sysimport pygame# 游戏状态 ready 未开始 gameing 游戏中 end 游戏结束class Util:"""工具类&#xff1a; 提供静态方法"""staticmethoddef click_check(sprite):""&…

Java基础篇--错误处理机制

尽管人人希望自己身体健康&#xff0c;处理的事情都能顺利进行&#xff0c;但在实际生活中总会遇到各种状况&#xff0c;比如感冒发烧&#xff0c;工作时电脑蓝屏、死机等。同样&#xff0c;在程序运行的过程中&#xff0c;也会发生各种非正常状况&#xff0c;例如&#xff0c;…

Netty注解实现服务调用

在之前完成了原生服务间的简单通信&#xff0c;现在我们将它整合到Spring环境中&#xff0c;这里就以实现服务的远程调用&#xff0c;简单模拟即可&#xff0c;具体代码需要自己动手改造。 既然是服务调用&#xff0c;那我们就使用代理模式来实现。 新建代理类&#xff0c;这里…

java八股文面试[java基础]—— 重载 和 重写

Java中&#xff0c;有一个名叫方法签名的东西&#xff0c;它的定义是这样的 Definition: Two of the components of a method declaration comprise the method signature—the method’s name and the parameter types. 大概意思是&#xff0c;方法签名有两部分组成——方法…

14、缓存预热+缓存雪崩+缓存击穿+缓存穿透

缓存预热缓存雪崩缓存击穿缓存穿透 ● 缓存预热、雪崩、穿透、击穿分别是什么&#xff1f;你遇到过那几个情况&#xff1f; ● 缓存预热你是怎么做到的&#xff1f; ● 如何避免或者减少缓存雪崩&#xff1f; ● 穿透和击穿有什么区别&#xff1f;它两一个意思还是截然不同&am…

8月16日上课内容 部署LVS-DR群集

本章结构&#xff1a; 数据包流向分析: 数据包流向分析&#xff1a; &#xff08;1&#xff09;客户端发送请求到 Director Server&#xff08;负载均衡器&#xff09;&#xff0c;请求的数据报文&#xff08;源 IP 是 CIP,目标 IP 是 VIP&#xff09;到达内核空间。 &#xf…

Linux 网络发包流程

哈喽大家好&#xff0c;我是咸鱼 之前咸鱼在《Linux 网络收包流程》一文中介绍了 Linux 是如何实现网络接收数据包的 简单回顾一下&#xff1a; 数据到达网卡之后&#xff0c;网卡通过 DMA 将数据放到内存分配好的一块 ring buffer 中&#xff0c;然后触发硬中断CPU 收到硬中…

跨境外贸业务,选择动态IP还是静态IP?

在跨境业务中&#xff0c;代理IP是一个关键工具。它们提供了匿名的盾牌&#xff0c;有助于克服网络服务器针对数据提取设置的限制。无论你是需要经营管理跨境电商店铺、社交平台广告投放&#xff0c;还是独立站SEO优化&#xff0c;代理IP都可以让你的业务程度更加丝滑&#xff…

神经网络基础-神经网络补充概念-54-softmax回归

概念 Softmax回归&#xff08;Softmax Regression&#xff09;是一种用于多分类任务的机器学习算法&#xff0c;特别是在神经网络中常用于输出层来进行分类。它是Logistic回归在多分类问题上的推广。 原理 Softmax回归的主要思想是将原始的线性分数&#xff08;得分&#xf…

【学习日记】【FreeRTOS】任务调度时如何考虑任务优先级——任务的自动切换

写在前面 本文开始为 RTOS 加入考虑任务优先级的自动调度算法&#xff0c;代码大部分参考野火。 本文主要是一篇学习笔记&#xff0c;加入了笔者自己对野火代码的梳理和理解。 一、基本思路 首先我们要知道&#xff0c;在 RTOS 中&#xff0c;优先级越高、越需要被先执行的的…

小程序商品如何指定人员

一般而言&#xff0c;商家小程序中有很多商品&#xff0c;不同商品可能由不同的供应商提供。当客户购买商品时&#xff0c;如何直接将订单发给不同的供应商呢&#xff1f;下面就来具体介绍一下。 1. 设置订单分发模式。在 订单管理->待处理订单 后面点击设置按钮&#xff0…

cve-2016-7193:wwlib 模块堆数据结构溢出

简介 漏洞编号&#xff1a;cve-2016-7193漏洞类型&#xff1a;堆溢出软件名称&#xff1a;Office模块名称&#xff1a;wwlib历史漏洞&#xff1a;较多影响的版本 攻击利用&#xff1a;APT 攻击利器-Word 漏洞 CVE-2016-7193 原理揭秘 操作环境 系统&#xff1a;Win10 1607软…

编译器过程

编译器过程 如果这个框架对应LLVM,为什么这么说LLVM是个框架呢?是因为它提供了中间表示的定义,即前端输出的文本格式定义. 那么 "前端" 可以是两者其一 : Clang 或者 LLVM-GCC "通用优化" 和 "x86后端" 是 LLVM 提供的. // LLVM 也提供 riscv后…

网络机顶盒什么牌子好?自费5000+测评整理网络机顶盒排行榜

在挑选网络机顶盒的时候很多人贪便宜选山寨杂牌&#xff0c;买回家问题频发&#xff0c;我做数码测评几年来身边的朋友们总会问我网络机顶盒什么牌子好&#xff0c;我自费购入了将近二十款网络机顶盒&#xff0c;通过软硬件的全方位对比后整理了网络机顶盒排行榜TOP5&#xff1…

CentOS7配置yum清华源、阿里源

CentOS7配置yum清华源、阿里源 本文为自己安装记录回顾用 下面的是Centos7 更换yum清华源、阿里源 Centos7默认的服务器是在国外&#xff0c;连接很慢。 更换成国内的镜像源&#xff0c;使用yum清华源、阿里源&#xff0c;连接就会快一点 下面介绍更换方法 前提&#xff1a;打…

SSD202D-logo分区添加dtb

SSD202D-kernel-uimage后面加入dtb_旋风旋风的博客-CSDN博客 1.由于内核的uimage老是压缩解压缩,拿到压缩包里面dtb实在困难; 2.把dtb烧在后面又有安全隐患;而且还会有打包升级方法ota之类的很多;又毙掉了, 3.最后直接把dtb放在logo的包里,但是logo包要想添加好,也要深刻的理…