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进行进程间通信

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

[CountDownLatch实现等待TcpServer启动完毕后再发射事件]

背景: 有时候,我们希望NettyServer启动时不能说卡住主线程。 也不能说:直接就启动一个线程,不然没办法发射出“服务器启动”这个事件。 这时就可以使用此类执行完毕后,通知下主线程。 1)TcpServer.java package org.e…

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

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

Kong 尝试使用JWT Plugin

Plugin的作用范围可以是在路由上也可以是customer上,还可以全局。 步骤 1. 在custom里面点击credentials,在右边选择添加JWT。 2. 填一个key和secret。 3. 用JWT编辑器生成一个token。payload加一个iss:"custom_key",校验的密钥…

alibaba集成的spring cloud组件有哪些?

阿里巴巴提供了一些与Spring Cloud集成的组件,这些组件可以帮助您构建可靠、弹性和高可用的分布式应用程序。以下是一些常用的阿里巴巴与Spring Cloud集成的组件: Alibaba Nacos:Nacos是一个用于服务注册、配置和发现的动态服务发现和配置管理…

python图像处理初步

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

软考论文框架

论文由背景过渡论点论述总结组成 论点论述:有理论和实践组成,说明论点定义、作用项目中对该论点的实际应用进行说明。 能画图就画图,可加分。 双拼论文 以一个主题为主论点,然后在每个主论点中,插入后面主题的论点。 整…