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

news2024/9/24 8:34:40

废话不多说,喊一句号子鼓励自己:程序员永不失业,程序员走向架构!本篇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节点则值为0
            int 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节点则值为0
            int 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.coloradmin.cn/o/986095.html

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

相关文章

K8S详细安装教程以及错误解决方案(包括前置环境,使用部署工具kubeadm来引导集群)

准备工作(来自官方文档) 一台兼容的 Linux 主机。Kubernetes 项目为基于 Debian 和 Red Hat 的 Linux 发行版以及一些不提供包管理器的发行版提供通用的指令。每台机器 2 GB 或更多的 RAM(如果少于这个数字将会影响你应用的运行内存&#xf…

kubeadm 安装k8s

目录 安装k8s 环境准备 所有节点,关闭防火墙规则,关闭selinux,关闭swap交换(必须关闭swap分区) //修改主机名 //所有节点修改hosts文件 //调整内核参数 所有节点安装docker 所有节点安装kubeadm,kube…

在线考试组卷Word文档导出|废纸篓|支持搜索组员查看练习情况|官网上线

土著刷题微信小程序v1.16,主要是对系统功能的优化,同时迭代开发了反馈热度比较高的【在线考试组卷word文档导出】和废纸篓功能。 下面将逐条介绍一下这一版的新功能和优化点。 在线考试组卷Word文档导出 【组卷Word导出】这个功能对于线下组织考试是个刚…

自动化运维工具Ansible教程(二)【进阶篇】

文章目录 前言Ansible 入门到精通自动化运维工具Ansible教程(一)【入门篇】自动化运维工具Ansible教程(二)【进阶篇】精通篇 进阶篇1. Ansible 的高级主题(例如:角色、动态清单、变量管理等)**1. 角色(Roles)**&#x…

linux-进程-execl族函数

exec函数的作用: 我们用fork函数创建新进程后,经常会在新进程中调用exec函数去执行另外一个程序。当进程调用exec函数时,该进程被完全替换为新程序。因为调用exec函数并不创建新进程,所以前后进程的ID并没有改变。 简单来说就是&…

看完这篇 教你玩转渗透测试靶机Vulnhub——Momentum:1

Vulnhub靶机Momentum:1渗透测试详解 Vulnhub靶机介绍:Vulnhub靶机下载:Vulnhub靶机安装:Vulnhub靶机漏洞详解:①:信息收集:②:漏洞发现:③:漏洞利用:④&#…

《Effective STL》读书笔记(二):vector和string

vector 和 string 优先于动态分配数组 当使用new动态分配内存时,我们需要关注以下内容 必须保证动态分配的内存会被delete,否则会造成资源泄露必须确保使用了正确的delete形式。如果分配了单个对象,则必须使用delete;如果分配了…

选择最适合您的Bug管理软件:市场比较与推荐

“Bug管理软件哪家好?市场上有许多优秀的Bug管理系统品牌如:Zoho Projects、JIRA、Redmine、Bugzilla、MantisBT。” 一款高效的Bug管理系统可以帮助团队更有效地发现、记录和解决软件中的问题,从而提高产品质量和用户满意度。本文将为您介绍…

JavaScript基础07——变量拓展-数组

哈喽,大家好,我是雷工! 每天打卡学习一点点,今天继续学习JavaScript基础知识,以下是学习笔记。 一、数组的基本介绍 数组 (Array)——一种将一组数据存储在单个变量名下的优雅方式。 数组的作用和变量一样…

【电源专题】典型设备的接地设计

在文章:【电源专题】接地的类型 中我们讲到不同的历史时期接地概念是不同的,有为了安全的电气接地和物理接地,也有为了提供参考电位的接地。 那么在设备接地的设计中,我们会怎么进行操作呢? 在文章【电源专题】接地的类型讲到一个混合接地的例子,我们可以把大功率的地接…

DF竞赛平台化身隐私计算大赛“超强助攻”,助力打造专业人才试炼场!

在技术可用性提升、应用需求增强以及政策大力支持的共同作用下,作为保障数据要素安全可信流通的有效技术手段,隐私计算技术火热发展,应用开始逐渐落地。在此背景下,中国信息通信研究院和中国通信学会联合行业多方力量,…

【MySQL】MySQL的安装,登录,配置和相关命令

文章目录 前言一. 卸载不需要的环境二. 获取MySQL的yum源三. 安装MySQL和启动四. 尝试登录MySQL方法1:获取临时root密码方法2:没有密码方法3:配置文件 五. 简单配置结束语 前言 本篇文章是基于云服务器;Linux:Centos7…

【excel密码】excel文件加密方法总结:

想要给Excel文件进行加密,方法有很多,今天分享三种Excel加密方法给大家。 打开密码 设置了打开密码的excel文件,打开文件就会提示输入密码才能打开excel文件,只有输入了正确的密码才能打开并且编辑文件,如果密码错误…

[A题]2023 年全国大学生数学建模比赛思路、代码更新中.....

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

Java高并发系列: 使用wait - notify实现高效异步方法

1. 背景 在项目开发中, 通常会有异步执行操作, 例如: 提交一个异步清空一系列数据库中ID ${_id} 的记录, 这个时候通常的做法是主线程将任务添加到一个异步队列中, 后台维护一个线程不断地循环扫描这个队列, 如果有需要执行的任务, 则执行相应的逻辑. 如下图所示: 2. 一个简…

Discourse 附件无法显示的跟进

今天登录表以后,发现数据又被清理了部分。 然后我们又重新使用 SQL 导入了数据。 这个让我们感觉 Discourse 的系统中应该设置了自动清理程序,在这个自动清理程序中会对认为没有使用的附件或者图片进行清理。 因为我们更换了存储空间,所以这…

在Linux中使用shell指令完成文件打包、压缩、解压缩

一、写一个1.sh脚本,将以下内容放到脚本中 在家目录下创建目录文件dir在dir下创建dir1和dir2把当前目录下的所有文件拷贝到dir1中,把当前目录下的所有脚本文件拷贝到dir2中把dir2打包并压缩为dir2.tar.xz再把dir2.tar.xz移动到dir1中解压dir1中的压缩包…

triton 客戶端用https协议访问服务

背景 平时调用模型服务,都是用httpIP的链接调用。但由于笔者环境的特殊性,访问模型必须经过一个https的公网URL,所以,如何用triton client访问https链接成为了一个问题 参考 TensorRT&Triton学习笔记(一):trito…

win7安装python3.8.10遇到的问题及解决办法和相关资源

在我的另一篇文章中,已经测试了win7安装不了python3.10.8 https://blog.csdn.net/kxltsuperr/article/details/132666737 那么,经过搜索,说win7最高可以安装python3.8.10,于是进行安装,结果报错,如下图&a…

【实战】React17+React Hook+TS4 最佳实践,仿 Jira 企业级项目(总结展望篇)

文章目录 一、项目起航:项目初始化与配置二、React 与 Hook 应用:实现项目列表三、TS 应用:JS神助攻 - 强类型四、JWT、用户认证与异步请求五、CSS 其实很简单 - 用 CSS-in-JS 添加样式六、用户体验优化 - 加载中和错误状态处理七、Hook&…