【面试经典150 | 链表】两数相加

news2024/9/24 5:26:43

文章目录

  • Tag
  • 题目来源
  • 题目解读
  • 解题思路
    • 方法一:模拟
  • 其他语言
    • python3
  • 写在最后

Tag

【单向链表】【数组】


题目来源

2. 两数相加


题目解读

对两个链表对应位置进行相加,最后返回结果链表的头结点。


解题思路

很多同学对链表操作不是很熟悉,但是对数组操作确实很熟悉,于是会想到先将两个链表中的值分别存入到两个数组中,然后对数组对应位置进行相加操作得到一个新的数组,最后将新的数组转化成链表。该方法就是将自己不熟悉领域的问题转化成熟悉的领域问题求解,方然可以解决问题。但是链表也是一种基本的数据结构,因此我们有必要掌握并使用链表来解决相关的问题,因此接下来将对使用链表的方法进行详细阐述。

关于数组的解答方法,大家可以自行尝试,并试着分析以下几个问题,前两个问题也是接下来 模拟 的方法需要考虑的问题。

  • 转化后的两个数组长度不一样,对应为如何相加?即一个链表的节点非空,另一个链表节点为空的情况。
  • 遇到两数相加和超过 9,如何进位?
  • 使用数组方法解决的空间复杂度是多少?还可不可以优化?

方法一:模拟

首先需要考虑几个问题:

  • 一个链表的节点非空,另一个链表对应位置节点为空时,怎么相加?很简单,空节点对应的数值我们就加上 0
  • 对应节点值相加大于 9,如何进位?我们需要维护一个进位变量 carry,表示当前需要进位多少,每次节点对应值相加计算需要加上 carry,相加结束后更新 carry

解决以上的两个问题之后,开始模拟计算:

  • 初始化 carry = 0
  • 迭代枚举两个链表中的节点,直到两个链表都被遍历完毕再退出 while() 循环;
  • 在循环中,两个节点分别记为 l1l2,当前需要进位的值为 carry,相加后的值定义为 sum
    • 如果 head1 为空,sum = (0 + l2->val + carry) % 10curry = (0 + l2->val + carry) / 10
    • 如果 head2 为空,sum = (l1->val + 0 + carry) % 10curry = (0 + l1->val + 0 + carry) / 10
    • 如果二者均非空,sum = (l1->val + l2->val + carry) % 10curry = (l1->val + l2->val + carry) / 10
    • 根据 sum 在需要返回的链表中建立节点。
  • 更新当前节点为下一个节点;
  • 最后,如果 carry > 0,不要忘记还要新建一个节点。

实现代码

/**
 * 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 *head = nullptr, *tail = nullptr;
        int carry = 0;
        while (l1 || l2) {
            int n1 = l1 ? l1->val : 0;
            int n2 = l2 ? l2->val : 0;
            int sum = n1 + n2 + carry;

            if (!head) {
                head = tail = new ListNode(sum % 10);
            }
            else {
                tail->next = new ListNode(sum % 10);
                tail = tail->next;
            }

            carry = sum / 10;
            if (l1) {
                l1 = l1->next;
            }
            if (l2) {
                l2 = l2->next;
            }
        }
        if (carry > 0) {
            tail->next = new ListNode(carry);
        }
        return head;
    }
};

复杂度分析

时间复杂度: O ( m a x ( m , n ) ) O(max(m, n)) O(max(m,n)) m m m n n n 分别为两个链表的长度。

空间复杂度: O ( 1 ) O(1) O(1),返回值不计入空间复杂度。


其他语言

python3

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:
    def addTwoNumbers(self, l1: Optional[ListNode], l2: Optional[ListNode]) -> Optional[ListNode]:
        dummy = p = ListNode(None)
        s = 0   # carry 值
        while l1 or l2 or s:
            s += (l1.val if l1 else 0) + (l2.val if l2 else 0)
            p.next = ListNode(s % 10)
            p = p.next
            s //= 10
            l1 = l1.next if l1 else None
            l2 = l2.next if l2 else None
        return dummy.next

写在最后

如果文章内容有任何错误或者您对文章有任何疑问,欢迎私信博主或者在评论区指出 💬💬💬。

如果大家有更优的时间、空间复杂度方法,欢迎评论区交流。

最后,感谢您的阅读,如果感到有所收获的话可以给博主点一个 👍 哦。

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

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

相关文章

如何在 Chrome 中设置HTTP服务器?

首先,定义问题:在 Chrome 浏览器中设置HTTP服务器主要涉及到修改网络设置,使用HTTP服务器可以帮助用户访问网络内容,提高网络速度或者保护隐私。 亲身经验:我曾在使用 Chrome 浏览器时,为了访问一些受限的网…

找搭子平台小程序开发制作方案

找搭子小程序是一个基于地理位置的社交平台,旨在帮助用户找到附近的人,一起进行各种活动。的目标是打造一个安全、便捷、有趣的社交平台,让用户在享受活动的同时,也能结识新朋友。 找搭子平台小程序的目标用户主要是年轻人&#x…

Go语言入门心法(十五):Go微服务实战

Go语言入门心法(一): 基础语法 Go语言入门心法(二): 结构体 Go语言入门心法(三): 接口 Go语言入门心法(四): 异常体系 Go语言入门心法(五): 函数 Go语言入门心法(六): HTTP面向客户端|服务端编程 Go语言入门心法(七): 并发与通道 Go语言入门心法(八): mysql驱动安装报错o…

【从删库到跑路】MySQL数据库 | 存储过程 | 存储函数(使用代码辅助理解)

🎊专栏【MySQL】 🍔喜欢的诗句:更喜岷山千里雪 三军过后尽开颜。 🎆音乐分享【The Right Path】 🥰欢迎并且感谢大家指出小吉的问题 文章目录 🎄存储过程介绍🎄存储过程特点🌺存储过…

Uniapp 原生设置的动态tabbar如何传参数动态 ?

在 UniApp 中设置原生 TabBar 并实现动态传参,可以通过使用Vue的响应式机制或者Vuex状态管理来实现。 以下是一个简单的示例: 以上这就是一个大概代码框架示例,具体实现应该根据项目需求做相应调整。欢迎来 注册 体验

大数据-Storm流式框架(二)--wordcount案例

一、编写wordcount案例 1、新建java项目 2、添加storm的jar包 storm软件包中lib目录下的所有jar包 3、编写java类 WordCountTopology.java package com.bjsxt.storm.wc;import backtype.storm.Config; import backtype.storm.LocalCluster; import backtype.storm.genera…

ideaSSM在线商务管理系统VS开发mysql数据库web结构java编程计算机网页源码maven项目

一、源码特点 SSM 在线商务管理系统是一套完善的信息管理系统,结合SSM框架和bootstrap完成本系统,对理解JSP java编程开发语言有帮助系统采用SSM框架(MVC模式开发),系统具有完整的源代码 和数据库,系统主…

轮胎尺寸后面的91W、101Y是啥意思?解释一下:轮胎载重指数和轮胎速度等级。

轮胎载重指数 轮胎的语言沟通是一组数字,并表示数据规格,品牌和类型的一系列信件的形式。这是普遍的,并得到了所有轮胎制造商全球达成一致。 “载重指数”是一个对应于最大载重量的数字(单位:公斤)&#xf…

【尘缘赠书活动:01期】Python数据挖掘——入门进阶与实用案例分析

引言 本案例将根据已收集到的电力数据,深度挖掘各电力设备的电流、电压和功率等情况,分析各电力设备的实际用电量,进而为电力公司制定电能能源策略提供一定的参考依据。更多详细内容请参考**《Python数据挖掘:入门进阶与实用案例…

RocksDB基本架构与原理详解

Rocksdb Flink提供基于流的有状态计算,除了提供实时数据流的处理能力,还需要将计算产生的状态存储起来。 为了满足状态存取需求,提供了memory、flie system、rocksdb三种类型的状态存储机制。 memory存取高效单空间有限,且可用…

【VPX302】基于3U VPX总线架构的高性能数据预处理平台

板卡概述 VPX302是一款基于3U VPX总线架构的高性能数据预处理FMC载板,板卡具有1个FMC(HPC)接口,1个X8 GTH背板互联接口,可以实现1路PCIe x8;具有4路SRIO X4。板卡采用Xilinx的高性能Kintex UltraScale系列…

Kmssink插件添加缩放显示功能的分析思路与具体实现

XILINX MPSOC 实现输出缩放,PL一侧的配置如下: 修改PL侧的显示通道流程为:DDR -> FRAMBUF_RD -> VPSS(SCALE) -> V_MIX -> HDMI_TX -> MONITOR , 通过设置HDMI_TX的宽高,利用xlnx_bridge 接口关联设置VPSS(scal…

MathType7.4绿色和谐版数学公式编辑器

MathType 是一个功能强大、所见即所得的数学公式编辑器,可以在 Word、PowerPoint 等办公软件中轻松输入各种复杂的物理公式、化学方程式和符号。由 MathType 创建的公式能与 Office 文档完美结合,显示效果很好;MathType 可在任何支持 OLE 对象…

数据分享 I 各地级市2022年乡村振兴数据

数据地址: 各地级市2022年乡村振兴数据https://www.xcitybox.com/datamarketview/#/Productpage?id364 基本信息. 数据名称: 各地级市2022年乡村振兴数据 数据格式: Shpxlsx 数据时间: 2022年 数据几何类型: 面 数据坐标系: WGS84坐标系 数据来源&#xff…

分布式事务-Seata-详细图文讲解

目录 分布式事务问题概述现象 Seata简介作用分布式事务处理过程处理过程 使用安装下载解压修改配置文件创建数据库创建数据表修改配置文件启动 异常超时异常——没加GlobalTransactional故障分析 解决异常 部分补充再看TC/TM/RM三大组件分布式事务的执行流程AT模式如何做到对业…

【Cheat Engine7.5】基础教程第一关(STEP1-2)

Cheat Engine简称CE 一、CE STEP1-2练习 1、打开 2、简介 欢迎使用 Cheat Engine 训练教程 (3.4) 本教程将尝试讲解在游戏中作弊的一些基本知识. 并帮助你熟悉 Cheat Engine 的使用方法 (简称为CE). 请按下面的步骤开始. 1: 首先要打开Cheat Engine (如果你还没有运行它的话…

1078. Bigram 分词

1078. Bigram 分词 java代码&#xff1a; class Solution {public String[] findOcurrences(String text, String first, String second) {String[] arr text.split(" ");List<String> list new ArrayList<String>();for (int i 0; i < arr.lengt…

基于物联网云平台的分布式光伏监控系统的设计与实现

贾丽丽 安科瑞电气股份有限公司 上海嘉定 201801 摘要&#xff1a;针对国内光伏发电监控系统的研究现状&#xff0c;文中提出了基于云平台的光伏发电监控体系。构建基于B/S架构的数据实时采集与推送&#xff0c;以SSH(strutsspringhibernate)作为Web开发框架&#xff0c;开发基…

维基百科是如何定义联合办公空间的?

联合办公是不同公司的员工共享办公空间的一种安排。它通过使用通用基础设施&#xff08;例如设备、公用设施、接待员和保管服务&#xff0c;以及在某些情况下的茶点和包裹接收服务&#xff09;来节省成本和提供便利。它对独立承包商、独立科学家、远程工作者、数字游民和经常旅…

跨项目配置,nacos的动态更新配置,如何才能生效

在SpringCloud项目中&#xff0c;有时会出现多个项目读取同一配置的场景&#xff0c;那么这种跨项目的动态更新配置&#xff0c;如何才能生效。 方案1.使用refreshable-dataids 如果配置文件是使用如下方式获取配置&#xff0c;只需要使用refreshable-dataids 在Nacos中&am…