java算法:两个数字相加

        首先看算法题描述:

1、给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。

2、请你将两个数相加,并以相同形式返回一个表示和的链表。

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

       看了描述之后,我们能得到的信息是,数字在链表中是逆序存放的,比如我们的数字123,在链表中是3 -> 2 -> 1,这样存放的。其实这样存的好处是显而易见的,这样我们便可以从链表头部开始依次计算。

       首先就是定义链表节点,代码如下:

class ListNode {int val;ListNode next;ListNode(int val) {this.val = val;}
}

          有了链表定义之后,我们就可以写对应的求和方法了,代码如下:

public ListNode add(ListNode l1, ListNode l2) {//定义一个指针指向l1,用于遍历链表l1ListNode p1 = l1;//定义一个指针指向l2,用于遍历链表l2ListNode p2 = l2;//定义一个进位的变量(当两个数字相加大于10的时候,就需要进位)int carry = 0;//定义一个链表用来存储相加后的结果ListNode resultNode = new ListNode(-1);//定义一个指针cur指向结果链表,用于给结果链表每个节点赋值ListNode cur = resultNode;//不断遍历两个链表,直到两个链表都遍历完才结束。其中一个链表先遍历完后,就只需要遍历剩下的那//个链表就可以了,先遍历完的那个链表的数字用0来代表。while (p1 != null || p2 != null) {//链表没有遍历完就取当前遍历到的节点的值,如果已经为null,则赋值为0int num1 = p1 != null ? p1.val : 0;int num2 = p2 != null ? p2.val : 0;//计算两个数字之和,由于可能有进位,因此需要把进位也带上int sum = num1 + num2 + carry;//计算低位数(如果两个数相加后不超过10,那么就是两数之和,如果超过了10,那么低位就是取个位上的数)int low = sum % 10;//求和之后需要重新计算进位carry = sum / 10;//把两数相加的低位数添加到结果链表中cur.next = new ListNode(low);cur = cur.next;//接下来就是遍历两个链表各自下一个节点了,当然,如果p1或p2指针已经指向null了,那么就不用管了,还是null就行p1 = p1 != null ? p1.next : p1;p2 = p2 != null ? p2.next : p2;}//由于在while循环中并没有处理最后的进位,如果两个链表最后的数字相加有进位的情况,那么需要把最后的进位也添加到结果链表if (carry > 0) {cur.next = new ListNode(carry);}//最后我们只需要返回结果链表即可(由于我们创建结果练笔的时候人为在头部加了一个-1的节点,要跳过它)return resultNode.next;
}

           下面我们写个测试方法来测试我们写的方法是否正确

@Test
public void test() {//我们定义两个数,存到数组里面,顺序也是逆序,比如我们要计算203+865的和,那么我们定义的两个数组分别如下int[] arr1 = {3, 0, 2};int[] arr2 = {5, 6, 8};//下面我们把两个数组组装到链表当中ListNode l1 = new ListNode(-1);ListNode cur1 = l1;for (int i = 0; i < arr1.length; i++) {cur1.next = new ListNode(arr1[i]);cur1 = cur1.next;}ListNode l2 = new ListNode(-1);ListNode cur2 = l2;for (int i = 0; i < arr2.length; i++) {cur2.next = new ListNode(arr2[i]);cur2 = cur2.next;}ListNode result = add(l1.next, l2.next);StringBuilder builder = new StringBuilder();while (result != null) {builder.append(result.val + "  ");result = result.next;}System.out.println(builder.toString());
}

         运行得到的结果:8  6  0  1  

         因为我们的结果链表也是逆序的,因此两数之和1068在链表中就是8 6 0 1,可见我们的结果是正确的,我们写的方法是最优解,简单明了。

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

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

相关文章

2024年认证杯SPSSPRO杯数学建模A题(第一阶段)保暖纤维的保暖能力全过程文档及程序

2024年认证杯SPSSPRO杯数学建模 A题 保暖纤维的保暖能力 原题再现&#xff1a; 冬装最重要的作用是保暖&#xff0c;也就是阻挡温暖的人体与寒冷环境之间的热量传递。人们在不同款式的棉衣中会填充保暖材料&#xff0c;从古已有之的棉花、羽绒到近年来各种各样的人造纤维。不…

【CSS基础】10.过度动画transition和动画animation

1. transition过度动画 1.1 介绍 CSS trnasition提供了一种在更改CSS属性时控制动画速度的方法。 可以让CSS的属性变化称为一个秩序一段时间的过程&#xff0c;而不是默认的立即生效 比如在基础9中我们学到的trnaslate可以让一个元素移动&#xff0c;但瞬间就完成了 我们可…

Java基础知识总结(52)

&#xff08;1&#xff09;String类部分方法 public class StringDemo2 { public static void main(String[] args) {String domainName "https://www.bytecollege";//trim() 去除字符串前后的空格System.out.println(" xyz ".trim());//xyzSystem.ou…

【DM8】临时表空间

临时表分类 事务级临时表会话级临时表 临时表&#xff0c;可以像普通表一样插入、更新和删除数据临时表的DML操作产生较少的redo日志临时表支持创建索引&#xff0c;以提高查询性能在一个会话或事务结束之后&#xff0c;数据将自动从临时表中删除不同的用户访问相同的临时表&a…

简述框架和函数库的区别

框架和函数库在软件开发中各自扮演着重要的角色&#xff0c;但它们之间也存在明显的区别。以下是它们之间的主要差异&#xff1a; 定义与目的&#xff1a; 函数库&#xff1a;函数库是一组预先编写好的函数的集合&#xff0c;这些函数可以被开发人员在其应用程序中调用&#xf…

正则表达式简介

1. 基础字符 . 任意单个字符除换行* 任意字符包含空字符? 任意单个字符[]括号中的出现一次()模式{n,m}出现n-m次^开头$结尾| 或者\w 匹配任意单词\d 匹配数字\s匹配空白字符 2. BRE vs ERE BRE: basic regex expresion ERE: extended regex expression 两者区别在于一些特…

KDTree和Octree的区别

在PCL&#xff08;PointCloud Library&#xff09;中&#xff0c;KD 树&#xff08;KDTree&#xff09;和 Octree&#xff08;Octree&#xff09;都是用于高效搜索点云数据的数据结构&#xff0c;它们之间的主要区别在于其构建方式和搜索性能&#xff1a; KD 树&#xff08;KD…

吴恩达深度学习 (week3,4)

文章目录 一、神经网络概述二、神经网络的表示三、神经网络的输出四、多个例子的向量化五、向量化实现的解释六、深度学习激活函数七、激活函数导数八、神经网络的梯度下降法九、深度学习随机初始化十、上述学习总结1、第一题2、第二题3、第三题4、第四题5、第五题6、第六题7、…

关于Transformer的面试题

文章目录 前言1、Transformer模型1. 1 基本要点1.2 提升 2、BN和LN的区别和联系2.1 基本要点2.2 扩展 3、PreNorm和PostNorm的区别[链接](https://www.zhihu.com/question/519668254)4、Multi-head self-attention中为什么要用三个不同的矩阵 前言 Transformer大模型的一些问题…

【GEE实践应用】哨兵1号和2号数据叠加

目录 1.数据叠加代码 2.代码逐句解释 1.数据叠加代码 var geometry table; //table是我们提前导入的矢量数据 // 加载Sentinel-2影像 var sentinel2 ee.ImageCollection("COPERNICUS/S2").filterBounds(geometry) // geometry是你感兴趣区域的几何对象.filte…

Redis:发布和订阅

文章目录 一、介绍二、发布订阅命令 一、介绍 Redis的发布和订阅功能是一种消息通信模式&#xff0c;发送者&#xff08;pub&#xff09;发送消息&#xff0c;订阅者&#xff08;sub&#xff09;接收消息。这种功能使得消息发送者和接收者不需要直接建立连接&#xff0c;而是通…

商标没有去注册有哪些不好的影响!

有些商家咨询普推知产老杨&#xff0c;商标没有去注册有哪些不好的影响&#xff0c;其实对企业来说还有许多实际不利的影响&#xff0c;有时代价比注册一个商标要大很多。 想的商标名称没去注册商标&#xff0c;如果别人抢注拿下商标注册证&#xff0c;那就会涉及侵权&#xf…

工厂方法模式:解锁灵活的对象创建策略

在软件设计中&#xff0c;工厂方法模式是一种非常实用的创建型设计模式&#xff0c;它不仅提升了系统的灵活性&#xff0c;还简化了对象的创建过程。本文将详细探讨工厂方法模式的核心概念、实现方式、应用场景以及与其他设计模式的对比&#xff0c;旨在提供一份全面且实用的指…

磁悬浮鼓风机市场规模不断增长 我国行业发展面临挑战

磁悬浮鼓风机市场规模不断增长 我国行业发展面临挑战 磁悬浮鼓风机又称磁悬浮高速离心鼓风机&#xff0c;指基于磁悬浮技术制成的气体输送设备。磁悬浮鼓风机综合性能优良&#xff0c;属于高效节能磁悬浮动力装备&#xff0c;在众多领域需求旺盛。未来随着国家节能环保政策逐渐…

阿里云优惠口令2024最新

2024年阿里云域名优惠口令&#xff0c;com域名续费优惠口令“com批量注册更享优惠”&#xff0c;cn域名续费优惠口令“cn注册多个价格更优”&#xff0c;cn域名注册优惠口令“互联网上的中国标识”&#xff0c;阿里云优惠口令是域名专属的优惠码&#xff0c;可用于域名注册、续…

01—JavaScript概述

一、初识Javascript JavaScript一种直译式脚本语言&#xff0c;是一种动态类型、弱类型、基于原型的语言&#xff0c;内置支持类型。它的解释器被称为JavaScript引擎&#xff0c;为浏览器的一部分&#xff0c;广泛用于客户端的脚本语言&#xff0c;最早是在 HTML&#xff08;标…

python3面向对象

1、面向对象编程概述 面向对象编程&#xff08;OOP&#xff09;是一种编程范式&#xff0c;它以“对象”为核心&#xff0c;将数据和操作封装在对象中&#xff0c;通过类和对象来实现代码的组织和复用。在Python3中&#xff0c;面向对象编程是其重要的特性之一。 2、类与对象…

jsoncpp 编译和使用

原文链接&#xff1a; jsoncpp的编译和使用 jsoncpp 编译出库文件 1.从github仓库下载 2.下载 cmake 工具 3.生成VS项目 4.编译得到需要的库文件 jsoncpp 的使用 查看原文

JAVA基础05-数据包装类,JAVA常用类 介绍

目录 基本数据类型的包装类 定义 String是字符串类型 创建String类型的对象 返回指定索引处的 char 值 返回某字符在字符串中出现的索引 替换 返回此字符串的长度 测试此字符串是否以指定的前缀开始 返回一个新的字符串 大小写转换 拆分字符串 字符串的创建及比较…

基于Springboot的自习室预订系统

基于SpringbootVue的自习室预订系统的设计与实现 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringbootMybatis工具&#xff1a;IDEA、Maven、Navicat 系统展示 用户登录页 网站首页 公告信息 留言反馈 后台管理 学生信息管理 公告信息管理 留言…