广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >两数相加的实现方法有哪些
  • 637
分享到

两数相加的实现方法有哪些

2024-04-02 19:04:59 637人浏览 独家记忆
摘要

这篇文章主要介绍“两数相加的实现方法有哪些”,在日常操作中,相信很多人在两数相加的实现方法有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”两数相加的实现方法有哪些”的疑惑

这篇文章主要介绍“两数相加的实现方法有哪些”,在日常操作中,相信很多人在两数相加的实现方法有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”两数相加的实现方法有哪些”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

“两数相加”

先来看题目描述

给你两个非空的链表,表示两个非负的整数。它们每位数字都是按照逆序的方式存储的,并且每个节点只能存储一位数字。请你将两个数相加,并以相同形式返回一个表示和的链表。你可以假设除了数字0之外,这两个数都不会以0开头。

两数相加的实现方法有哪些

两数相加

链表节点的数据结构如下:

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; }  }

题目说明

题目描述相对来说比较绕,我们可以直接理解为两个多位的整数相加,只不过整数的每一位都是通过链表进行存储。比如,整数342,通过链表存储正常来说应该是3->4->2,但是计算时,往往需要从低位开始计算,逢十进一,所以题目中直接将整数表示为2->4->3,这样反而不用将链表顺序进行反转了,直接相加就可以了。

两数相加的实现方法有哪些

两数相加

需要注意的是如果两个链表的长度不同,则可以认为长度短的链表的后面有若干个 0  ,链表遍历结束,则如果进位值大于0,则还需要在结果链表中附加一个值为1的节点。

方法一:模拟

上面已经提到,链表是逆序的,因此直接对应数字相加即可。基本操作遍历两个列表,逐位计算它们的和,并与当前位置的进位值相加。

比如,两个链表对应位的数字分别为n1和n2,进位为carry(通常为0和1),则它们的和为(n1 + n2 + carry),对应位上数字变为(n1 +  n2 + carry)%10,新的进位为(n1 + n2 + carry)/10。

如果两个链表长度不一样,长度短的链表后续对应位上值均为0即可。如果遍历结束之后,carray大于0(也就是等于1),则在结构链表后面新增一个节点,

实现代码如下:

class Solution {     public ListNode addTwoNumbers(ListNode l1, ListNode l2) {         ListNode head = null, tail = null;         int carry = 0;         while (l1 != null || l2 != null) {             int n1 = l1 != null ? l1.val : 0;             int n2 = l2 != null ? l2.val : 0;             int sum = n1 + n2 + carry;             if (head == null) {                 head = tail = new ListNode(sum % 10);             } else {                 tail.next = new ListNode(sum % 10);                 tail = tail.next;             }             carry = sum / 10;             if (l1 != null) {                 l1 = l1.next;             }             if (l2 != null) {                 l2 = l2.next;             }         }         if (carry > 0) {             tail.next = new ListNode(carry);         }         return head;     } }

上述方法时间复杂度的计算与链表的长度有关,比如两个链表的长度分别为m和n,则遍历的次数为max(m,n),也就m和n中取最大值,所以时间复杂度为O(n)。

由于要对链表的每一位进行计算存储,并且最后如果有进位,还要多加一位,因此最长链表为max(m,n)+1,所以空间复杂度为O(n);

通过思路分析,写出上面的代码还是比较容易的。但这个题目是否可以考虑用递归的形式来解决呢?我们来看看方法二。

方法二:递归

第一种方法很简单,按照正常的思维逻辑来就可以了。但评论区有这样一句话“不用递归没有灵魂。尽管多数时候,递归不见得更有效率。”那么我们就来看看用递归的形式如何实现。

class Solution {     public ListNode addTwoNumbers(ListNode l1, ListNode l2) {         return add(l1,l2,0);     }     public ListNode add(ListNode l1, ListNode l2, int carry){         if(l1 == null && l2 == null && carry == 0) return null;         int x = l1==null ? 0 : l1.val;         int y = l2==null ? 0 : l2.val;         int sum = x + y + carry;         ListNode n = new ListNode(sum % 10);         n.next = add(l1==null ? null : l1.next,                      l2==null ? null : l2.next,                      sum/10);         return n;      } }

上述代码的基本迭代逻辑循环如下:

两数相加的实现方法有哪些

两数相加

通过上图我们可以推演一下递归调用的时间复杂度。针对递归调用的时间复杂度计算,本质上要看:递归的次数??每次递归中的操作次数。那么,上述方法递归了几次呢?递归的次数也是与两个链表最长的那个的长度有关,最后可能会因为进位多算一次,因此递归次数为n或n+1,而内部计算并不随n的变化而变化,执行次数为常数。因此整体时间复杂度为n*1  = O(n)。

空间复杂度依旧与结果链表的长度有关,因此依旧为O(n)。

到此,关于“两数相加的实现方法有哪些”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

--结束END--

本文标题: 两数相加的实现方法有哪些

本文链接: https://www.lsjlt.com/news/84005.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 两数相加的实现方法有哪些
    这篇文章主要介绍“两数相加的实现方法有哪些”,在日常操作中,相信很多人在两数相加的实现方法有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”两数相加的实现方法有哪些”的疑惑...
    99+
    2022-10-19
  • JavaScript判断两个数组相等的方法有哪些
    这篇文章主要介绍“JavaScript判断两个数组相等的方法有哪些”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“JavaScript判断两个数组相等的方法有哪些”文章能帮助大家解决问题。循环比较使用...
    99+
    2023-07-05
  • 有哪些实现两个数互换的方法
    本篇内容主要讲解“有哪些实现两个数互换的方法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“有哪些实现两个数互换的方法”吧!基本数据类型借助第三个变量packag...
    99+
    2022-10-19
  • python3两数相加的实现示例
    两数相加 给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。 请你将两个数相加,并以相同形式返回一个表示和的链表...
    99+
    2022-11-12
  • 实现Linux数据加密的方法有哪些
    这篇文章主要介绍“实现Linux数据加密的方法有哪些”,在日常操作中,相信很多人在实现Linux数据加密的方法有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”实现Linux数据加密的方法有哪些”的疑惑有所...
    99+
    2023-06-12
  • C++实现算法两个数字相加详解
    Add Two Numbers 两个数字相加 You have two numbers represented by a linked list, where each n...
    99+
    2022-11-12
  • C++如何实现算法两个数字相加
    这篇文章主要为大家展示了“C++如何实现算法两个数字相加”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“C++如何实现算法两个数字相加”这篇文章吧。Add Two Numbers 两个数字相加Yo...
    99+
    2023-06-20
  • Go实现MD5加密的方法有哪些
    这篇文章主要介绍“Go实现MD5加密的方法有哪些”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Go实现MD5加密的方法有哪些”文章能帮助大家解决问题。第一种方法:md5.New() 和 Writep...
    99+
    2023-07-05
  • Python中两个列表数字“相加”的4种方法
    最近我在用Python处理数据时,需要将列表数据相加实现“累积”效果的。需要注意,我这里所说的列表相加,并非是下面这种“列表元素相加”的情况。 list_1 = [1, 2, 3]list_2 = [4, 5, 6]print(list_1...
    99+
    2023-08-31
    python numpy 开发语言
  • vue-router实现懒加载的方法有哪些
    本篇文章为大家展示了vue-router实现懒加载的方法有哪些,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。未使用懒加载import Vue from 'vue...
    99+
    2023-06-06
  • php实现自动加载的方法有哪些
    本篇内容主要讲解“php实现自动加载的方法有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“php实现自动加载的方法有哪些”吧!1、__autoload()方法,一个项目只能有一个__auto...
    99+
    2023-06-20
  • perl比较两个数组的方法有哪些
    在Perl中,可以使用不同的方法来比较两个数组。以下是一些常见的方法:1. 使用循环:可以使用循环来逐个比较两个数组中的元素。可以使...
    99+
    2023-09-26
    perl
  • python保留两位小数的方法有哪些
    这篇文章主要讲解了“python保留两位小数的方法有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“python保留两位小数的方法有哪些”吧!方法:1、用字符串格式化,语法“print(&...
    99+
    2023-07-04
  • Python实现"加一"的两种方法
    给定一个非空的数值数组代表一个非负整数,对整数进行加一操作 整数最高位存放在数组头位,数组中每一个元素都代表一个数字 你可以认为整数不以0开头,除了数字0以外 Example 1: Input: [1,2,3] Output: [1,...
    99+
    2023-01-31
    两种 方法 Python
  • sql两个表的数据合并相加方法是什么
    在SQL中,可以使用UNION ALL和SUM函数来实现两个表的数据合并相加。1. UNION ALL:将两个表的数...
    99+
    2023-09-15
    sql
  • java添加数据的方法有哪些
    在Java中,添加数据的方法有以下几种:1. 使用数组:可以使用数组来添加数据。首先需要定义一个数组,然后使用索引来添加数据。例如:int[] arr = new int[10]; arr[0] = 1;2. 使用ArrayList:A...
    99+
    2023-08-09
    java
  • MySQL中实现加密解密的方法有哪些
    这篇文章给大家介绍MySQL中实现加密解密的方法有哪些,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。双向加密双向加密有三种方法:ENCODE/DECODE传入两个值,一个是要加密的记录,一个是加密和解密的key.加密之...
    99+
    2023-06-14
  • Android之Intent附加数据的两种实现方法
    本文实例讲述了Android之Intent附加数据的两种实现方法。分享给大家供大家参考。具体如下: 第一种写法,用于批量添加数据到Intent: Intent intent ...
    99+
    2022-06-06
    方法 数据 intent Android
  • PHP实现交换两个整型变量的方法有哪些
    这篇文章主要介绍“PHP实现交换两个整型变量的方法有哪些”,在日常操作中,相信很多人在PHP实现交换两个整型变量的方法有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”PHP实现交换两个整型变量的方法有哪些...
    99+
    2023-06-25
  • Java Double相加出现的问题有哪些
    这篇文章主要介绍“Java Double相加出现的问题有哪些”,在日常操作中,相信很多人在Java Double相加出现的问题有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java&...
    99+
    2023-06-22
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作