LeetCode第二题: 两数相加

文章目录

  • 题目描述
    • 示例
  • 解题思路 - 迭代法
    • Go语言实现 - 迭代法
    • 算法分析
  • 解题思路 - 模拟法
    • Go语言实现 - 模拟法
    • 算法分析
  • 解题思路 - 优化模拟法
  • 主要方法
    • 其他方法的考虑

题目描述

给出两个非空的链表用来表示两个非负的整数。其中,它们各自的位数是按照逆序的方式存储的,并且它们的每个节点只能存储一位数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。

示例

示例 1:

输入: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]

解题思路 - 迭代法

我们可以遍历两个链表,模拟数字相加的过程。需要注意的是,如果两个链表的长度不同,我们需要对较短的链表进行特殊处理。另外,如果相加的结果大于等于10,我们需要进行进位处理。

Go语言实现 - 迭代法

下面是使用Go语言实现的迭代法代码:

/*** Definition for singly-linked list.* type ListNode struct {*     Val int*     Next *ListNode* }*/
func addTwoNumbers(l1 *ListNode, l2 *ListNode) *ListNode {dummyHead := &ListNode{Val: 0}p, q, curr := l1, l2, dummyHeadcarry := 0for p != nil || q != nil {x := 0y := 0if p != nil {x = p.Valp = p.Next}if q != nil {y = q.Valq = q.Next}sum := carry + x + ycarry = sum / 10curr.Next = &ListNode{Val: sum % 10}curr = curr.Next}if carry > 0 {curr.Next = &ListNode{Val: carry}}return dummyHead.Next
}

算法分析

  • 时间复杂度: O(max(m, n)),其中 m 和 n 分别为两个链表的长度。
  • 空间复杂度: O(max(m, n)),我们需要一个新链表来存储结果。
    这个算法的时间复杂度和空间复杂度都是线性的,与较长的链表长度相同。

除了迭代法之外,还可以使用递归法来解决“两数相加”的问题。递归法的基本思想是将问题分解为更小的子问题,即相加两个链表的当前节点,然后递归地处理下一个节点。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

解题思路 - 模拟法

通过链表的形式逐位计算两个数的和,同时考虑进位的情况。从两个链表的头节点开始,逐对节点相加,将结果创建为新的链表节点。如果两个链表的长度不一致,则将较短链表的剩余部分视为0进行处理。整个过程中,我们需要维护当前的进位信息。

Go语言实现 - 模拟法

func addTwoNumbers(l1 *ListNode, l2 *ListNode) *ListNode {head := &ListNode{0, nil} // 创建哑节点作为返回链表的头节点curr := headcarry := 0 // 初始化进位为0for l1 != nil || l2 != nil || carry > 0 {sum := carry // 开始时将进位加入和中if l1 != nil {sum += l1.Val // 加上第一个链表的值l1 = l1.Next // 移动到下一个节点}if l2 != nil {sum += l2.Val // 加上第二个链表的值l2 = l2.Next}carry = sum / 10 // 计算新的进位curr.Next = &ListNode{sum % 10, nil} // 创建新的节点存储和的个位数curr = curr.Next // 移动到新创建的节点}return head.Next // 返回哑节点的下一个节点,即结果链表的头节点
}

算法分析

  • 时间复杂度: O(max(m,n)),其中 m 和 n 分别是两个链表的长度。我们需要遍历两个链表的最长长度。
  • 空间复杂度: O(max(m,n))。新链表的长度最多为 max(m,n) + 1。

解题思路 - 优化模拟法

实际上,上述模拟法已经是相对高效的解法了。在具体实现过程中,进一步的优化空间不大。如果要优化,主要是代码层面的简化和优化,比如简化变量的使用,减少不必要的操作等,但算法本身的时间复杂度和空间复杂度已经达到了最优。

在这个问题中,关键是理解如何逐位相加并处理进位。优化的空间更多的在于代码的可读性和简洁性上,而不是算法复杂度的提升。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

对于LeetCode题目2“两数相加”,实际上存在的解决方案主要围绕着迭代和递归两种思路展开。由于题目的特性和限制,解题方法相对固定,主要是如何处理两个链表的逐位相加以及进位处理。

主要方法

  1. 迭代法:这是最直观的方法,通过遍历两个链表,逐位计算和,并处理进位。迭代法的优点是直观易懂,实现简单,是大多数情况下的首选方法。
  2. 递归法:递归法利用递归函数来逐位相加,每一层递归处理一位。递归法的优点是代码更为简洁,但对于理解和调试来说可能稍微复杂一些。递归的深度等于链表的长度,因此对于非常长的链表可能会导致栈溢出。

其他方法的考虑

除了这两种方法,实际上没有根本上不同的算法来解决这个特定的问题。其他的所谓“方法”往往是对上述两种方法的变体或优化,例如:

  • 优化存储:对于迭代法,可以通过直接在较长的链表上进行修改来节省空间,避免额外的空间分配。但这改变了输入数据,可能并不总是可接受的。
  • 并行处理:理论上,如果链表足够长,可以考虑将链表分成几部分并行处理每一部分的加法。然而,这种方法在实践中很少使用,因为它增加了实现的复杂性,而且链表的遍历性质和计算机的内存访问模式使得并行化的效果并不明显。

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

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

相关文章

2024.2.25 模拟实现 RabbitMQ —— 网络通信设计(服务器)

目录 引言 约定应用层的通信协议 自定义应用层协议 Type Length PayLod 实现 Broker Server 类 属性 与 构造 启动 Broker Server 停止 Broker Server 处理客户端连接 读取请求 与 写回响应 根据请求计算响应 清除 channel 引言 生产者 和 消费者 都是客户端&…

Onlyfans 地址错误、无法支付、年龄验证等问题解决方案!!!

很多客户在 Onlyfans 绑卡时,出现了地址错误,年龄验证,无法支付等各种问题。 出现这个问题的原因: 一是用国内邮箱注册了, 二是 ip 有问题,会导致出现年龄验证,或无法支付 Onlyfans 等问题。…

OpenHarmony 分布式开发实战——线上菜单

简介 分布式菜单demo 模拟的是多人聚餐点菜的场景,不需要扫码关注公众号等一系列操作,通过分布式数据库可以方便每个人可及时查看到订单详情,数量,总额等;效果如下 demo效果 工程目录 完整的项目结构目录如下 ├─…

linux系统---httpd

目录 Internet的起源 一、http协议——超文本传输协议 1.http相关概念 二、HTTP请求访问的完整过程 1、 建立连接 2、 接收请求 3、 处理请求 常用请求Method: GET、POST、HEAD、PUT、DELETE、TRACE、OPTIONS 3.1 常见的HTTP方法 3.2 GET和POST比较 4、访问资源 …

【postgresql】数据表id自增与python sqlachemy结合实例

需求: postgresql实现一个建表语句,表名:student,字段id,name,age, 要求:每次添加一个数据id会自动增加1 在PostgreSQL中,您可以使用SERIAL或BIGSERIAL数据类型来自动生成主键ID。以下是一个创建名为stude…

MongoDB之客户端工具与核心概念及基本类型篇

MongoDB之客户端工具与核心概念及基本类型篇 文章目录 MongoDB之客户端工具与核心概念及基本类型篇1. MongoDB是什么?1. 关于MongoDB2. 相关客户端工具1. MongoDB Compass2. Studio 3T3. Navicat for MongoDB4. NoSQL Manager for MongoDB Professional 2.MongoDB相关概念2.1 …

4.测试教程 - 用例篇

文章目录 1.测试用例的基本要素2.测试用例的给我们带来的好处3.测试用例的设计方法3.1基于需求进行测试用例的设计3.1.1功能需求测试分析3.1.2非功能需求测试分析 3.2具体的设计方法3.2.1等价类3.2.2边界值3.2.3错误猜测法3.2.4判定表3.2.5场景设计法3.2.6因果图3.2.7因果图的需…

Python 鼠标模拟

鼠标模拟即:通过python 进行模拟鼠标操作 引入类库 示例如下: import win32api import win32con import time 设置鼠标位置 设置鼠标位置为窗口中的回收站。 示例如下: # 设置鼠标的位置 win32api.SetCursorPos([30, 40]) 双击图标 设置…

springboot+vue前后端分离适配cas认证的跨域问题

0. cas服务搭建参考:CAS 5.3服务器搭建_cas-overlay-CSDN博客 1. 参照springsecurity适配cas的方式, 一直失败, 无奈关闭springssecurity认证 2. 后端服务适配cas: 参考前后端分离项目(springbootvue)接入单点登录cas_前后端分离做cas单点登录-CSDN博客 1) 引入maven依赖 …

如何系统地自学 Python

设定学习目标 确定自己学习 Python 的目的和用途,这一步很重要,比如是为了编写脚本、开发网站、进行数据分析等。设定清晰的学习目标,把目标拆分为一个个阶段的小目标,通过完成一个个小目标,得到正反馈,激…

SD-WAN解决企业组网中网络卡顿问题

网络卡顿已成为企业组网中一大难题,特别是随着办公应用系统的内网服务器或云端部署,员工对网络的依赖日益增加。面对网络卡顿问题,我们不得不深入思考如何提升工作效率并改善员工体验。本文将深入探讨企业组网中的网络问题,并介绍…

DeepMind基础世界模型Genie:一张草图即为一个世界,通用AI智能体要来了?

一张草图即为一个世界!Google DeepMind 推出了首个以无监督方式从未经标注的互联网视频中训练而来的生成交互环境模型——Genie。该模型可以通过文本、合成图像、照片甚至草图来生成无数种可玩(动作可控)的虚拟世界。 据介绍,Geni…

使用管道和system V进行进程间通信

进程通信的目的 数据传输:一个进程需要将它的数据发送给另一个进程资源共享:多个进程之间共享同样的资源。通知事件:一个进程需要向另一个或一组进程发送消息,通知它(它们)发生了某种事件(如进程…

投资生涯的核心密码:构建交易逻辑体系

首先,我们需要明确一点,交易中究竟有没有确定性? 确定性是指在某一种形式、或有若干条件时,价格必然会上涨或下跌,也可以决定上涨或下跌的程度。 我认为,没有。迄今为止还没有一个理论能发现即使确定的东西…

python图像处理初步

文章目录 处理流程灰度分布图 处理流程 在Python中,通过【plt】和【numpy】可以实现图像处理的最简单的流程,即读取图片->处理图片->显示结果->保存结果。 import matplotlib.pyplot as plt import numpy as nppath lena.jpg img plt.imrea…

春节医美热,爱美客、昊海生科谁更赚钱?

在颜值经济赛道上,医美项目逐渐成为消费主流。随着春节假期的到来,医美消费又将迎来高峰期。 “医美三剑客”中,爱美客(300896.SZ)、昊海生科(688366.SH)近日相继公布了2023年的业绩报告:2023年,爱美客预计实现净利润…

白敬亭风波后现身,心情低落进新剧组,父母暖心陪伴。

♥ 为方便您进行讨论和分享,同时也为能带给您不一样的参与感。请您在阅读本文之前,点击一下“关注”,非常感谢您的支持! 文 |猴哥聊娱乐 编 辑|徐 婷 校 对|侯欢庭 白敬亭春晚首秀引热议,口碑因“春山学”风波陷两极…

掌握Docker:让你的应用轻松部署和管理

文章目录 一、引言(为什么要学习docker?)1.1 环境不一致1.2 隔离性1.3 弹性伸缩1.4 学习成本 二、Docker介绍2.1 Docker的由来2.2 什么是Docker2.3 为什么要用Docker2.3.1 虚拟机2.3.2 Linux容器 2.4 Docker与传统虚拟机的区别2.5 Docker的思…

微信小程序(四十五)登入界面-简易版

注释很详细,直接上代码 上一篇 此文使用了vant组件库,没有安装配置的可以参考此篇vant组件的安装与配置 新增内容: 1.基础组件的组合 2.验证码倒计时的逻辑处理 源码: app.json {"usingComponents": {"van-field…

打印水仙花数---c语言刷题

欢迎关注个人主页:逸狼 创造不易,可以点点赞吗~ 如有错误,欢迎指出~ 题述 求出0~100000之间的所有“水仙花数”并输出。 “水仙花数”是指一个n位数,其各位数字的n次方之和确好等于该数本身,如:153&#…