【每日一题Day254】LC445两数相加Ⅱ | 链表反转 栈

news2024/9/28 17:30:39

两数相加Ⅱ【LC445】

给定两个 非空链表 l1l2 来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储一位数字。将这两数相加会返回一个新的链表。

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

img
原来是专题模拟

反转链表

2022/11/4

  • 思路:将链表1、链表2反转后进行求和,并使用变量记录进位,最后将结果再进行反转后返回

  • 实现

    • 如果有一个链表为空链表,那么将另一个链表返回

    • 将链表1、链表2反转得到新的头结点cur1、cur2

    • 使用变量cnt记录低位节点相加后的进位结果,使用cur记录求和后的结果

    • 当两个链表不都为空时,需要进行累加(val1+val2+cnt)%10得到新节点

      • 注意:需要处理空节点,空节点的值记为0
      • 更新:cnt = (val1+val2+cnt)/10
    • 最后判断是否存在进位,如果存在的话加在链表末尾

    • 最后将结果进行反转

  • 代码

    /**
     * Definition for singly-linked list.
     * public class ListNode {
     *     int val;
     *     ListNode next;
     *     ListNode() {}
     *     ListNode(int val) { this.val = val; }
     *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
     * }
     */
    class Solution {
        public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
            if (l1 == null){
                return l2;
            }
            if (l2 == null){
                return l1;
            }
            ListNode cur1 = reverse(l1);
            ListNode cur2 = reverse(l2);
            int cnt = 0;
            ListNode dummyNode = new ListNode(0);
            ListNode cur = dummyNode;       
            while (cur1 != null || cur2 != null){
                int val1 = cur1 == null ? 0 : cur1.val;
                int val2 = cur2 == null ? 0 : cur2.val; 
                cur.next = new ListNode((cnt + val1 + val2) % 10);
                cnt = (cnt + val1 + val2 ) / 10;
                cur1 = cur1 == null ? null : cur1.next ;
                cur2 = cur2 == null ? null : cur2.next ;
                cur = cur.next;
            }
            if (cnt != 0){
                cur.next = new ListNode(cnt);
            }
            return reverse(dummyNode.next);
        }
        public ListNode reverse(ListNode head){
            ListNode dummyNode = new ListNode(0,head);
            ListNode cur = dummyNode.next;
            while (cur != null && cur.next != null){
                ListNode nextTemp = cur.next.next;
                cur.next.next = dummyNode.next;
                dummyNode.next = cur.next;
                cur.next = nextTemp;
            }
            return dummyNode.next;
        }
    }
    
  • 复杂度分析

    • 时间复杂度:O(N+M),其中 N和M分别是链表中的节点数。
    • 空间复杂度:O(1),返回值不计入空间复杂度

前后双指针

2022/11/5

  • 思路:使用前后双指针将链表中的两数之后记录在数组中,然后倒序遍历数组,处理产生的进位,最后通过数组生成链表

  • 实现

    • 先将两个链表遍历一遍,统计其节点个数,记为n1,n2,使用数组nums记录数值
    • 然后设置指针位于链表的起点,记为cur1,cur2
      • 如果n1 > n2,那么将cur1先移动n1-n2步,并将数值记录在nums中
      • 如果n2 > n1,那么将cur2先移动n1-n2步,并将数值记录在nums中
    • 此时cur1和cur2位于相同位置,将链表中的两数进行相加操作,并将数值(val1+val2)记录在nums中
    • 使用变量cnt记录低位的进行,然后倒序遍历数组处理进位
    • 判断是否存在最高位进位,如果存在的话加在链表开头
    • 最后通过nums数组构建链表
  • 代码

    /**
     * Definition for singly-linked list.
     * public class ListNode {
     *     int val;
     *     ListNode next;
     *     ListNode() {}
     *     ListNode(int val) { this.val = val; }
     *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
     * }
     */
    class Solution {
        public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
            if (l1 == null){
                return l2;
            }
            if (l2 == null){
                return l1;
            }
            ListNode cur1 = l1;
            ListNode cur2 = l2;
            int n1 = 0, n2 = 0;
            // 统计个数
            while (cur1 != null){
                n1++;
                cur1 = cur1.next;
            }
            while (cur2 != null){
                n2++;
                cur2 = cur2.next;
            }
            cur1 = l1;
            cur2 = l2;
            int i = 0;
            int[] nums;
            // 移动后指针
            if (n1 > n2){
                nums = new int[n1];
                while (i < n1 - n2){
                    nums[i++] = cur1.val;
                    cur1 = cur1.next;
                }
            }else {
                nums = new int[n2];
                while (i < n2 - n1){
                    nums[i++]= cur2.val;
                    cur2 = cur2.next;
                }
            }
            // 链表相加
            while (cur1 != null && cur2 != null){
                nums[i++] = cur1.val + cur2.val;
                cur1 = cur1.next;
                cur2 = cur2.next;
            }
            // 处理进位
            int cnt = 0;
            for (i = nums.length - 1; i >= 0;i--){
                int tmp = (nums[i] + cnt) / 10;
                nums[i] = (nums[i] + cnt) % 10;
                cnt = tmp;
            }
            // 构造链表
            ListNode dummyNode = new ListNode(0);
            ListNode cur = dummyNode;
            if (cnt != 0){
                cur.next = new ListNode(cnt);
                cur = cur.next;
            }
            for(i = 0; i < nums.length; i++){
                cur.next = new ListNode(nums[i]);
                cur = cur.next;
            }
         
            return dummyNode.next;
        
        }
    
    }
    
  • 复杂度分析

    • 时间复杂度:O(N+M),其中 N和M分别是链表中的节点数。
    • 空间复杂度:O(N+M),返回值不计入空间复杂度

2022/11/5

  • 思路:由于链表中数位的顺序与加法的顺序相反,为了逆序处理所有数位,可以使用栈,把所有数字压入栈中,再依次取出相加,计算过程中注意进位的情况

  • 实现:倒序构建链表,注意使用变量记录当前节点的下一节点,完成链表的构建

    class Solution {
        public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
            if (l1 == null){
                return l2;
            }
            if (l2 == null){
                return l1;
            }
            ListNode cur1 = l1;
            ListNode cur2 = l2;
            Deque<ListNode> st1 = new LinkedList<>();
            Deque<ListNode> st2 = new LinkedList<>();
            while (cur1 != null ){
                st1.addFirst(cur1);
                cur1 = cur1.next;
            }
            while (cur2 != null){
                st2.addFirst(cur2);
                cur2 = cur2.next;
            }
            int cnt = 0;
            ListNode nn = null;
            while (!st1.isEmpty() || !st2.isEmpty() || cnt != 0){
                int val1 = st1.isEmpty() ? 0 :st1.pollFirst().val;
                int val2 = st2.isEmpty() ? 0 :st2.pollFirst().val;
                int val = (val1 + val2 + cnt) % 10;
                cnt = (val1 + val2 + cnt) / 10;
                ListNode ptr = new ListNode(val);
                ptr.next = nn;
                nn = ptr;
            }
        
            return nn;
        
        }
    
    }
    

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

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

相关文章

MySQL 记一个调优记录:最大化获取 uid 和 mobile

目录 前言调优过程总结 前言 环境&#xff1a;MySQL 5.6、windows 11 前阵子&#xff0c;有一个 BI 看板跑不起来&#xff0c;每次执行跑了很久&#xff0c;还不一定有结果&#xff0c;急需维护迭代。 经过调试&#xff0c;发现看板的SQL 逻辑中有一个开销非常大的逻辑影响了整…

2 Prometheus 简介

目录 1. 起源 2. Prometheus 架构 2.1 指标收集 2.2 服务发现 2.3 聚合和警报 2.4 查询数据 2.5 服务自治 2.6 冗余和高可用性 2.7 可视化 3. Prometheus数据模型 3.1 指标名称 3.2 标签 3.3 采样数据 3.4 符号表示 3.5 保留时间 4. 安全模型 5. Prometheus生态…

AI会取代程序员吗?这几个事实告诉你真相

人工智能&#xff08;AI&#xff09;的迅猛发展引起了许多关于其对各行各业的影响的讨论&#xff0c;其中包括程序员的未来。有人认为&#xff0c;AI的出现可能会使程序员岗位面临消失的风险&#xff0c;因为它们可以自动化编码和解决问题的过程。然而&#xff0c;在我们下结论…

MySQL:UNION的使用

UNION的使用 前言一、合并查询结果二、语法格式&#xff1a;三、UNION操作符四、UNION ALL操作符五、使用 前言 本博主将用CSDN记录软件开发求学之路上亲身所得与所学的心得与知识&#xff0c;有兴趣的小伙伴可以关注博主&#xff01; 也许一个人独行&#xff0c;可以走的很快…

全志V3S嵌入式驱动开发(full image制作和资料汇总)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 所谓的full image制作&#xff0c;就是制作一个image&#xff0c;上面包含了所有的嵌入式软件、库和配置文件。之前虽然我们也构建了spi-nor、spi-…

AC/DC(二): 整流

一、全波整流电路 全波整流电路可以看作是由两个半波整流电路组合而成&#xff0c;如图1所示&#xff0c; 图1 变压器次级线圈中间引出一个中心抽头&#xff0c;把次级线圈分成两个对称的绕组&#xff0c;从而引出大小相等但极性相反的两个电压VD1、VD2&#xff0c;构成VD1、…

14 MFC多进程

文章目录 创建进程win32子进程内容创建进程传递参数关闭进程通过配置文件读取全部代码 打开进程便利进程 创建进程 分别创建MFC应用程序和Win32应用程序 MFC应用程序界面设置 win32子进程内容 #include <Windows.h> int WINAPI wWinMain(HINSTANCE hInstance, HINSTAN…

分享在Linux下使用OSGi.NET插件框架快速实现一个分布式服务集群的方法

在这篇文章我分享了如何使用分层与模块化的方法来设计一个分布式服务集群。这个分布式服务集群是基于DynamicProxy、WCF和OSGi.NET插件框架实现的。我将从设计思路、目标和实现三方面来描述。 1 设计思路 首先&#xff0c;我来说明一下设计思路。我们先来看看目前OSGi.NET插件…

C++中生成二维码-libqrencode

文章目录 前言libqrencode在qt中调用libqrencode其他 前言 二维码的种类很多。本文仅介绍&#xff0c;如何用C生成QR码(QRcode)。通常而言&#xff0c;我们不需要知道QR码的详细结构&#xff0c;如QrCode的结构原理与实战 | 张展鹏的博客。我们只需要&#xff0c;可以将文本转…

Python——— 字符串

&#xff08;一&#xff09;字符串 字符串是 Python 中最常用的数据类型。我们可以使用引号 ( 或 " ) 来创建字符串。顾名思义&#xff0c;羊肉串是由羊肉做成的串&#xff0c;而字符串就是由字符组成的。 字符串的本质是&#xff1a;字符序列。 2 Python 不支持单字符…

Kafka 小结

Kafka 是由 Linkedin 开发并开源的分布式消息系统&#xff0c;因其分布式及高吞吐率而被广泛使用&#xff0c;现已与 Cloudera Hadoop、Apache Storm、Apache Spark、Flink 集成。 Kafka 使用场景 页面访问量 PV、页面曝光 Expose、页面点击 Click 等行为事件&#xff1b;实时计…

低分辨率图像中目标检测(附论文下载)

关注并星标 从此不迷路 计算机视觉研究院 公众号ID&#xff5c;ComputerVisionGzq 学习群&#xff5c;扫码在主页获取加入方式 论文地址&#xff1a;https://arxiv.org/pdf/2201.02314.pdf 计算机视觉研究院专栏 作者&#xff1a;Edison_G 超分辨率&#xff08;SR&#xff09;等…

【Openvino03】深入了解OpenVINO™ 工具包与Jupyter Notebooks工程

接上一篇&#xff0c;本篇将以OpenVINO™ 工具包、Jupyter Notebook工具以及OpenVINO™ Notebooks工程为基础&#xff0c;依照构建环境、工具学习、案例学习、实战部署的顺序引导初学者完成从0到1学习人工智能的全过程&#xff0c;希望众多对人工智能感兴趣的开发者&#xff0c…

【多维BFS】ABC308 D

VP的时候居然花了半小时&#xff01; 可恶&#xff01; D - Snuke Maze (atcoder.jp) 题意&#xff1a; 思路&#xff1a; 首先&#xff0c;我们发现到达一个格子之后&#xff0c;下一个格子的字符是确定的 但是&#xff0c;下一个格子到底是哪个是不确定的 下一个格子不…

FreeRTOS源码解析——第一章 整体架构

FreeRTOS源码解析 第一章 FreeRTOS 整体架构 第二章 FreeRTOS 编程规范 第三章 FreeRTOS 内存管理 第四章 FreeRTOS 任务管理 第五章 FreeRTOS 消息队列 第六章 FreeRTOS 软件定时器 第七章 FreeRTOS 信号量 第八章 FreeRTOS 互斥量 第九章 FreeRTOS 任务通知 第十章 FreeRTOS…

算法习题之宏观分层问题

宏观分层 习题1 给定一个正方形矩阵matrix&#xff0c;原地调整成顺时针90度转动的样子习题2 给定一个长方形矩阵matrix&#xff0c;实现转圈打印习题3 给定一个正方形或者长方形矩阵matrix&#xff0c;实现zigzag打印习题4 输入N,在控制台上输出初始边长为N的图案 习题1 给定一…

U盘数据丢失是什么原因?轻松让U盘数据恢复的教程

在数字化时代&#xff0c;我们不可避免地使用各种便携式存储设备&#xff0c;如U盘&#xff0c;来传输和存储重要数据。然而&#xff0c;有时我们可能不小心删除了U盘中的文件&#xff0c;或者格式化了U盘等等而导致数据丢失。这种情况下&#xff0c;你可能会困惑地想知道&…

机器学习——基于Tensorflow和Keras实现卷积神经网络CNN——猫狗分类

文章目录 环境的配置神经网络CNN的介绍卷积前馈神经网络卷积神经网络应用邻域 数据集准备数据预处理构建基准模型 总结什么是过拟合&#xff08;overfit&#xff09;&#xff1f;什么是数据增强&#xff1f;单独制作数据增强&#xff0c;精确率提高了多少&#xff1f; 然后再添…

硬件大熊原创合集(2023/06更新)

06月份更新篇章&#xff1a; 一款射频芯片的layout设计指导案例-篇章1 一款射频芯片的layout设计指导案例-篇章2 警惕超声波工艺对晶振造成损伤 走嵌入式方向&#xff0c;一定要软硬件都懂吗&#xff1f; 6月份广州光亚展&#xff0c;和电子电力大咖文老师见了个面&#xff0c;…

2023车载摄像头9大热点趋势

摘要&#xff1a; 相较于消费类电子摄像头&#xff0c;车载摄像头的工作环境极度恶劣&#xff0c;比如说震动、高温、雨雾、低温、光线变化剧烈等。而车载摄像头以驾驶安全为目的&#xff0c;上述各个工作状态下&#xff0c;均需要能获取稳定、可靠、清晰的周边环境数据。 近年…