【算法训练-链表 五】【求和】:链表相加(逆序)、链表相加II(顺序)

废话不多说,喊一句号子鼓励自己:程序员永不失业,程序员走向架构!本篇Blog的主题是【链表相加】,使用【链表】这个基本的数据结构来实现,这个高频题的站点是:CodeTop,筛选条件为:目标公司+最近一年+出现频率排序,由高到低的去牛客TOP101去找,只有两个地方都出现过才做这道题(CodeTop本身汇聚了LeetCode的来源),确保刷的题都是高频要面试考的题。

在这里插入图片描述

名曲目标题后,附上题目链接,后期可以依据解题思路反复快速练习,题目按照题干的基本数据结构分类,且每个分类的第一篇必定是对基础数据结构的介绍

链表相加【MID】

题干

首先来一道逆序版,稍微比较好搞一些的,因为链表只能向后遍历:
直接粘题干和用例

解题思路

整体思路就是遍历完两个链表进行相加并将结果集放到新的链表上

  1. 设置返回链表的链表头,设置进位cnt=0.
  2. 从头开始遍历两个链表,直到两个链表节点都为空:
    1. 每次取出不为空的链表节点值,为空就设置为0
    2. 将两个数字与cnt相加,就是当前的总和
    3. 将总和(对10取模)加入新的链表节点,连接在返回链表后面,并继续往后遍历,并用总和对10除获取进位值
  3. 如果两个链表都遍历完成,cnt进位还有值,则补充创建一个节点,值为cnt

代码实现

给出代码实现基本档案

基本数据结构链表
辅助数据结构
算法迭代
技巧双指针

其中数据结构、算法和技巧分别来自:

  • 10 个数据结构:数组、链表、栈、队列、散列表、二叉树、堆、跳表、图、Trie 树
  • 10 个算法:递归、排序、二分查找、搜索、哈希算法、贪心算法、分治算法、回溯算法、动态规划、字符串匹配算法
  • 技巧:双指针、滑动窗口、中心扩散

当然包括但不限于以上

;
import java.util.*;/** public class ListNode {*   int val;*   ListNode next = null;*   public ListNode(int val) {*     this.val = val;*   }* }*/public class Solution {/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可*** @param head1 ListNode类* @param head2 ListNode类* @return ListNode类*/public ListNode addInList (ListNode head1, ListNode head2) {// 1 先将两个链表反转过来ListNode p1 = head1;ListNode p2 = head2;// 2 设置结果集以及初始化进位标识符ListNode dummy = new ListNode(-1);ListNode p = dummy;int cnt = 0;// 3 目标是遍历完两个链表的全部长度while (p1 != null || p2 != null) {// 3-1 获取当前节点值,如果是null节点则值为0int d1 = p1 == null ? 0 : p1.val;int d2 = p2 == null ? 0 : p2.val;// 3-2 计算总和、进位值、当前节点值int curSum = d1 + d2 + cnt;cnt = curSum / 10;p.next =  new ListNode(curSum % 10);// 3-3 结果指针移动,节点指针移动p = p.next;p1 = p1 == null ? null : p1.next;p2 = p2 == null ? null : p2.next;}// 4 全部结果如果遍历完,进位值还是大于0,则设置为最后一个节点if (cnt > 0) {p.next =  new ListNode(cnt);}return dummy.next;}
}

复杂度分析

时间复杂度:遍历链表,时间复杂度为O(N)
空间复杂度:不算返回的结果集的话,没有用到辅助空间,所以空间复杂度为O(1)

链表相加II【MID】

在这里插入图片描述

题干

进阶版,值为顺序,但链表是单向的,不能反过来遍历
在这里插入图片描述

解题思路

虽然链表不能反过来遍历,但是我们可以开始的时候就反转链表,然后返回结果时候再反转回去

  1. 任意一个链表为空,返回另一个链表就行了,因为链表为空相当于0,0加任何数为0,包括另一个加数为0的情况。
  2. 相继反转两个待相加的链表,反转过程可以参考反转链表。
  3. 设置返回链表的链表头,设置进位cnt=0.
  4. 从头开始遍历两个链表,直到两个链表节点都为空:
    1. 每次取出不为空的链表节点值,为空就设置为0
    2. 将两个数字与cnt相加,就是当前的总和
    3. 将总和(对10取模)加入新的链表节点,连接在返回链表后面,并继续往后遍历,并用总和对10除获取进位值
  5. 如果两个链表都遍历完成,cnt进位还有值,则补充创建一个节点,值为cnt
  6. 返回前将结果链表再反转回来。

代码实现

给出代码实现基本档案

基本数据结构链表
辅助数据结构
算法迭代
技巧双指针

其中数据结构、算法和技巧分别来自:

  • 10 个数据结构:数组、链表、栈、队列、散列表、二叉树、堆、跳表、图、Trie 树
  • 10 个算法:递归、排序、二分查找、搜索、哈希算法、贪心算法、分治算法、回溯算法、动态规划、字符串匹配算法
  • 技巧:双指针、滑动窗口、中心扩散

当然包括但不限于以上

;
import java.util.*;/** public class ListNode {*   int val;*   ListNode next = null;*   public ListNode(int val) {*     this.val = val;*   }* }*/public class Solution {/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可*** @param head1 ListNode类* @param head2 ListNode类* @return ListNode类*/public ListNode addInList (ListNode head1, ListNode head2) {// 1 先将两个链表反转过来ListNode p1 = reverse(head1);ListNode p2 = reverse(head2);// 2 设置结果集以及初始化进位标识符ListNode dummy = new ListNode(-1);ListNode p = dummy;int cnt = 0;// 3 目标是遍历完两个链表的全部长度while (p1 != null || p2 != null) {// 3-1 获取当前节点值,如果是null节点则值为0int d1 = p1 == null ? 0 : p1.val;int d2 = p2 == null ? 0 : p2.val;// 3-2 计算总和、进位值、当前节点值int curSum = d1 + d2 + cnt;cnt = curSum / 10;p.next =  new ListNode(curSum % 10);// 3-3 结果指针移动,节点指针移动p = p.next;p1 = p1 == null ? null : p1.next;p2 = p2 == null ? null : p2.next;}// 4 全部结果如果遍历完,进位值还是大于0,则设置为最后一个节点if (cnt > 0) {p.next =  new ListNode(cnt);}return reverse(dummy.next);}private ListNode reverse(ListNode head) {if (head == null) return null;ListNode pre = null;ListNode cur = head;while (cur != null) {ListNode pNext = cur.next;cur.next = pre;pre = cur;cur = pNext;}return pre;}
}

复杂度分析

时间复杂度:遍历链表,时间复杂度为O(N)
空间复杂度:不算返回的结果集的话,没有用到辅助空间,所以空间复杂度为O(1)

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

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

相关文章

【unity3D】如何修改相机的默认视角

💗 未来的游戏开发程序媛,现在的努力学习菜鸡 💦本专栏是我关于游戏开发的学习笔记 🈶本篇是unity的如何修改相机的默认视角 如何修改相机的默认视角 Game窗口运行的话视角是这样的: 此时Scene窗口的视角是这样的&…

[华为云云服务器评测] 华为云耀云服务器 Java、node环境配置

系列文章目录 第一章 [linux实战] 华为云耀云服务器L实例 Java、node环境配置 文章目录 系列文章目录前言一、任务拆解二、修改密码三、配置安全规则四、远程登录并更新apt五、安装、配置JDK环境5.1、安装openjdk,选择8版本5.2、检查jdk配置 六、安装、配置git6.1、安装git6.2…

Git版本管理

Git版本介绍 Git 是一个分布式版本控制系统,它被广泛用于协作软件开发和管理代码的变更。Git 的设计目标是为了处理速度快、灵活性强、数据完整性好的版本管理需求。以下是 Git 版本管理的详细介绍: 版本控制系统 (VCS): Git 是一种版本控制…

湖南省副省长秦国文一行调研考察亚信科技

9月5日,湖南省人民政府党组成员、副省长秦国文一行到亚信科技调研考察,亚信科技高级副总裁陈武主持接待。 图:双方合影 在亚信科技创新展示中心,秦国文了解了亚信科技在5G、算力网络、人工智能、大数据等前沿领域的创新探索&…

冠达管理:股票退市整理期?

近些年来,随着我国股市的发展,股票市场的出资者逐渐增多。但在出资过程中,退市股票的问题也成为了备受重视的论题。那么,股票退市收拾期到底是什么?如何应对退市股票? 首要,什么是股票退市收拾…

2023京东医疗保健器械行业数据分析(京东数据分析平台)

随着人们对自身健康的重视程度不断加深,当前市场中各类对疾病具有诊断、预防、监护、治疗或者缓解的医疗保健仪器越来越受到消费者的关注。 根据鲸参谋电商数据分析平台的相关数据显示,今年7月份,京东平台医疗保健仪器的销量为950万&#xf…

SpringCloud(34):Nacos服务发现

1 从单体架构到微服务 1.1单体架构 Web应用程序发展的早期,大部分web工程师将所有的功能模块打包到一起并放在一个web容器中运行,所有功能模块使用同一个数据库,同时,它还提供API或者UI访问的web模块等。 尽管也是模块化逻辑,但是最终它还是会打包并部署为单体式应用,这…

【HTML5高级第三篇】drag拖拽、音频视频、defer/async属性、dialog应用

文章目录 一、拖拽事件1.1 拖拽事件1.2 案例:拖拽丢弃图片 二、音频和视频三、defer 与 async 属性3.1 概述3.2 示例一:3.3 示例二: 四、dialog 元素 一、拖拽事件 原生JavaScipt案例合集 JavaScript DOM基础 JavaScript 基础到高级 Canvas…

React 全栈体系(四)

第二章 React面向组件编程 六、组件的生命周期 1. 效果 需求:定义组件实现以下功能&#xff1a; 让指定的文本做显示 / 隐藏的渐变动画从完全可见&#xff0c;到彻底消失&#xff0c;耗时2S点击“不活了”按钮从界面中卸载组件 <!DOCTYPE html> <html lang"e…

elasticsearch的索引库操作

索引库就类似数据库表&#xff0c;mapping映射就类似表的结构。我们要向es中存储数据&#xff0c;必须先创建“库”和“表”。 mapping映射属性 mapping是对索引库中文档的约束&#xff0c;常见的mapping属性包括&#xff1a; type&#xff1a;字段数据类型&#xff0c;常见的…

大数据课程K18——Spark的ALS算法与显式矩阵分解

文章作者邮箱:yugongshiye@sina.cn 地址:广东惠州 ▲ 本章节目的 ⚪ 掌握Spark的ALS算法与显式矩阵分解; ⚪ 掌握Spark的ALS算法原理; 一、ALS算法与显式矩阵分解 1. 概述 我们在实现推荐系统时,当要处理的那些数据是由用户所提供的自身的偏好数据,这些…

k8s node环境部署(三)

1、添加node1、node2环境 前面配置master环境的截图最后一段 复制下来 分别在node主机执行 kubeadm join 192.168.37.132:6443 --token p5omh3.cqjqt8ymrwkdn2fc \ --discovery-token-ca-cert-hash sha256:608a1cbadd060cfdeac2fae84c19609061b750ab51bf9a19887ff7ea…

Ubuntu之apt-get系列--安装JDK8--方法/教程

原文网址&#xff1a;Ubuntu之apt-get系列--安装JDK8--方法/教程_IT利刃出鞘的博客 简介 本文介绍如何在Ubuntu下安装JDK8。 验证是否安装 可以通过如下命令判断系统是否有安装ssh服务&#xff1a; 命令 java -version 结果 如上所示&#xff0c;表示还没有安装。 查看…

实训三:多表查询 - 大学数据库创建与查询实战

大学数据库创建与查询实战 第1关&#xff1a;数据库表设计任务描述相关知识大学数据库的整体设计教师信息表&#xff08;instructor&#xff09;开课信息表&#xff08;section&#xff09; 编程要求测试说明参考代码 第2关&#xff1a;查询&#xff08;一&#xff09;任务描述…

[虚幻引擎插件介绍] DTGlobalEvent 蓝图全局事件, Actor, UMG 相互回调,自由回调通知事件函数,支持自定义参数。

本插件可以在虚幻的蓝图 Actor&#xff0c; Obiect&#xff0c;UMG 里面指定绑定和执行消息&#xff0c;可带自定义参数。 参数支持 Bool&#xff0c;Byte&#xff0c;Int&#xff0c;Int64&#xff0c;Float&#xff0c;Name&#xff0c;String&#xff0c;Text&#xff0c;Ve…

Ubuntu 20.04 LTS 安装Kubernetes 1.26

1、环境配置 (1)添加主机名称解析记录 cat > /etc/hosts << EOF 192.168.44.200 master01 master01.bypass.cn 192.168.44.201 node01 node01.bypass.cn 192.168.44.202 node02 node02.bypass.cn EOF(2)禁止K8s使用虚拟内存 swapoff -a sed -ri s(.*swap.*)#\1…

自然语言处理:提取长文本进行文本主要内容(文本意思)概括 (两种方法,但效果都一般)

本文主要针对长文本进行文本提取和中心思想概括&#xff0c;原文档放在了附件里面&#xff1a;<科大讯飞公告> -----------------------------------方法一&#xff1a;jieba分词提取文本&#xff08;句子赋分法&#xff09;------------------------- 1、首先导入相关…

方向介绍:基于深度学习的轨迹预测

方向介绍&#xff1a;基于深度学习的轨迹预测 文章目录 方向介绍&#xff1a;基于深度学习的轨迹预测问题定义典型方法挑战未来展望参考 基于深度学习的轨迹预测是一种利用神经网络模型来预测移动物体的未来位置和运动状态的技术。这种技术在许多领域都有重要的应用&#xff0c…

Nosql数据库服务之redis

Nosql数据库服务之redis 一图详解DB的分支产品 Nosql数据库介绍 是一种非关系型数据库服务&#xff0c;它能解决常规数据库的并发能力&#xff0c;比如传统的数据库的IO与性能的瓶颈&#xff0c;同样它是关系型数据库的一个补充&#xff0c;有着比较好的高效率与高性能。 专…

AlexNet 06

一、发展 1989年&#xff0c;Yann LeCun提出了一种用反向传导进行更新的卷积神经网络&#xff0c;称为LeNet。 1998年&#xff0c;Yann LeCun提出了一种用反向传导进行更新的卷积神经网络&#xff0c;称为LeNet-5 AlexNet&#xff0c;VGG&#xff0c;GoogleNet&#xff0c;R…