【数据结构】——链表OJ(下)

news2025/5/14 11:22:00

前面我们已经刷了几道单链表的题目,下面我们继续看几道题目。

一、相交链表

这道题题目的要求是很好理解的,就是现在我们有两个链表,然后我们就相办法进行判断,这两个链表是否是相交的,那么链表的相交其实就是有没有共同的节点,所以,我们很快可以想到的是,我们去遍历两个链表,然后看其节点是否会有相同的部分。但是我们拿上面题目的例子会发现这样是行不通的,这是因为我们的链表的长度不一样,所以到相交点的距离是不一样的,那么我们遍历的话,是没办法同一个循环到这个节点的。那么我们是否可以先求出两个链表的长度,然后我们求其长度的差,然后让较长的链表先走长度差,然后再一起进行遍历判断节点是否相同呢?

下面我们试试这个方法:

 

可以看到这种方法是可行的,那么我们有的朋友可能会有点疑问,题目是要求返回的是这个开始相交的节点,那么我们长的链表先进行遍历是否会先进入这个相交的节点呢,其实是不会的,这就要提到我们链表相交的几种情况了:

 

链表相交就基本上是上面的几种情况了, 有的朋友可能会想到我们的X型的相交情况,但是这种相交在链表中是不会存在的,这是因为我们的单链表一旦相交,那么其后面的下一个节点都是一样的了,不会出现这种情况。然后就是上面提到的,先走的链表会不会出现先到相交节点的情况,这其实也是不会的,这是因为我们通过上面的图可以发现,其实我们两个链表的相交节点到链表的尾节点的距离是一样的了,那么我们先走几步也是不会到这个相交节点的。如果先到,那么相交节点到尾节点的这个距离相等的结论也就不成立了。

那么我们发现如果两个链表相交的话,那么我们的尾节点是一定会相等的,但是我们这道题的话要返回开始相交的节点,所以这样不行的。但是如果是判断是否相交就可以这样了。   

二、环形链表(1)

这道题题目的要求就是,其有一个链表,然后这个链表中,可能会形成环的结构,那么我们可以进行遍历链表,创建两个指针进行遍历,判断其节点的是否相等,如果相等,那么就是环,但是我们这两个指针该如何进行创建呢?我们要是都再头节点开始,那么我们就会导致我们一开始这两个指针就是一样的,所以这个是行不通的,其实我们还是可以用到我们前面学习到的快慢指针,一个指针一次走两步,一个指针一次走一步,然后快的指针就会先进环,然后慢的指针再进环,然后这两个指针就会在环内进行追逐,但是我们是否可以保证其在环内一定可以碰上呢,一个走步,一个走一步的话,我们会发现其之间相差的距离会缩小一个节点,那么其最终肯定是可以碰上的。那么如果是一个走三步,一个走一步呢?

我们来分析一下,比如,当前我们的两个指针,相差的距离是N,那么我们每次遍历,那么两个指针的距离就会变成N-2,然后继续循环,那么其情况就有两种,一种就是N一开始是偶数,那么其一直会直接走到0,那么此时两个指针就会相遇了,那么如果N是奇数呢,那么其最后两个指针的距离是变成N-2->N-4->N-6.......->5->3->1->N-1,那么此时就会进入到第二圈的追逐,那么我们会发现第二圈开始追逐,此时两个指针之间要追逐的距离变成了偶数,所以我们可以发现,其不管快慢指针之间相差多少,其最终都还是会相遇的。

那么我们循环的条件是啥呢?我们直接设置为快指针即可,这是因为快指针走的快,如果这是个非环形链表,那么其快指针会很快走到空,那么就可以结束循环,如果是环形链表,那么其就会在圈内追逐,直到相遇,不过,要注意的是,我们的快指针在遇到非环形指针时,如果链表是偶数个节点,那么我们如果直接使用快指针,那么其在刚刚好到达尾节点,其要是往下走两步,那么就会造成对空指针进行解引用了。所以我们循环的条件设置为快指针和快指针的下一个指针。

代码如下:

 

 三、环形链表(2)

这道题就是上面第一个环形链表的升级版了,这里不单要判断链表是否为环,然后还要返回第一个入环的节点,例如上面就要找到2这个节点。

这里我们就直接用一个结论就行,就是环形链表中。我们的快慢指针相遇的点,和头节点到入环的节点的距离是一样的。那么我们可以先让快慢指针先相遇,然后再创建一个指针从头节点开始往后遍历,慢指针也开始遍历,然后慢指针和这个保存着头节点的指针相遇的节点就是入环的节点。

如下:

 

四、随机链表的复制 

 这道题会发现和我们上面的链表是有点不一样的吗,这些链表会比我们前面学习的链表多了一个节点指针,这个多的指针是随机指向的,当前题目是要我们将原链表进行拷贝,形成一个新的链表,然后其除了地址不同,其他的都是一样的。

那么我们如何进行拷贝呢?

如果是单单的拷贝普通的链表我们还是很好搞定,不过我们还是要向操作系统进行节点的申请,那么我们要写一个申请节点的操作。

我们直接将思路吧,我们这个题目主要是对于拷贝后的rondom如何进行寻找。我们可以先拷贝这个节点,然后将这个拷贝的节点插到原链表中原节点的后面,然后再对rondom进行处理,然后再将这个拷贝的链表和原链表进行断开。

下面我们来通过代码实现吧:

 

 

谢谢大家的阅读,给个三连吧。 

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

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

相关文章

Adobe Acrobat pro在一份PDF中插入空白页

在Adobe Acrobat pro中先打开我们的PDF文件; 用鼠标点击需要插入空白页处的上一页; 然后如下图操作: 默认会在光标处的下一页插入一张空白页,你也可以修改插入页的页码或者向前一页插入

java-----异常

对于Error:表示系统级错误或者资源耗尽的状况,像OutOfMemoryError、StackOverflowError等。这类错误是程序无法处理的,通常也不应该尝试去处理。 对于Exception:表示程序可以处理的异常。它又能细分为: 受检查异常&a…

[工具]B站缓存工具箱 (By 郭逍遥)

📌 项目简介 B站缓存工具箱是一个多功能的B站缓存工具,包含视频下载、缓存重载、文件合并及系统设置四大核心功能。基于yutto开发,采用图形化界面操作,极大简化B站资源获取与管理流程。 工具可以直接将原本缓存的视频读取&#…

自动化测试与功能测试详解

🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 什么是自动化测试? 自动化测试是指利用软件测试工具自动实现全部或部分测试,它是软件测试的一个重要组成 部分,能完成许多手工测试无…

CSS经典布局之圣杯布局和双飞翼布局

目标: 中间自适应,两边定宽,并且三栏布局在一行展示。 圣杯布局 实现方法: 通过float搭建布局margin使三列布局到一行上relative相对定位调整位置; 给外部容器添加padding,通过相对定位调整左右两列的…

OpenCV 的 CUDA 模块中用于将多个单通道的 GpuMat 图像合并成一个多通道的图像 函数cv::cuda::merge

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 在 OpenCV 的 CUDA 模块中,cv::cuda::merge 函数用于将多个单通道的 GpuMat 图像合并成一个多通道的图像。该函数是 cv::merge 的 GP…

计网实验笔记(一)CS144 Lab

Lab0 ByteStream : 实现一个在内存中的 有序可靠字节流Lab1 StreamReassembler:实现一个流重组器,一个将字节流的字串或者小段按照正确顺序来拼接回连续字节流的模块Lab2 TCPReceiver:实现入站字节流的TCP部分。Lab3 TCPSender:实…

什么是ERP?ERP有哪些功能?小微企业ERP系统源码,SpringBoot+Vue+ElementUI+UniAPP

什么是ERP? ERP翻译过来叫企业资源计划,通俗的讲,应该叫企业的全面预算控制,其通常包括三个部分:工程预算、投资预算和经营预算(即产销存预算)。之所以做预算控制,是因为企业运作的…

dockerfile: PaddleOCR hubserving api 服务

前言 目前 OCR 有比较成熟的方案,想着直接通过 docker 部署一个提供 api 接口服务,查看了一些开源方案,最终发现还是 PaddleOCR 比较好用。 本篇不介绍 PaddleOCR 的详细使用方式,只介绍一下构建镜像的 dockerfile 需要注意的事…

Vue3+uniapp 封装axios

1.第一步在项目根目录新建utils文件夹,里边新建两个文件request.js和uni-api-promisify.js 2.request.js 代码 要安装axios import axios from axios import { showToast } from /utils/uni-api-promisify// 创建axios实例 const service axios.create({baseURL:…

QEMU模拟32位ARM实现自定义系统调用

实现自定义系统调用 如何使用 QEMU 模拟32位 ARM 环境参考:使用Qemu模拟32位ARM系统 修改linux内核源码 使用 linux-4.4.240 源码,下载链接:下载链接 在 arch\arm\include\uapi\asm\unistd.h 文件下新增系统调用 sys_test: /…

MySQL——数据类型表的约束

目录 数据类型 数值类型 tinyint类型 bit类型 float类型 decimal类型 字符类型 char类型 varchar类型 日期和时间类型 选择类型 表的约束 null default comment zerofill primary key auto_increment unique key foreign key 数据类型 在MySQL中的数据类…

# YOLOv2:目标检测的升级之作

YOLOv2:目标检测的升级之作 在目标检测领域,YOLO(You Only Look Once)系列算法以其高效的速度和创新的检测方式受到了广泛关注。今天,我们就来深入探讨一下 YOLOv2,看看它是如何在继承 YOLOv1 的基础上进行…

【爬虫】DrissionPage-1

官网地址:DrissionPage官网 小需求采集,我喜欢,我要学。 1 介绍 这是用python编写的爬虫自动化工具,将Selenium 和 Requests 的功能巧妙地整合在一起,提供了统一又简单的操作接口。开发者可以在浏览器模式&#xff0…

Oracle OCP认证考试考点详解083系列15

题记: 本系列主要讲解Oracle OCP认证考试考点(题目),适用于19C/21C,跟着学OCP考试必过。 71. 第71题: 题目 解析及答案: 关于在 Oracle 18c 及更高版本中基于 Oracle 黄金镜像的安装,以下哪…

部署大模型:解决ollama.service: Failed with result ‘exit-code‘的问题

起因是这样: Loaded: loaded (/etc/systemd/system/ollama.service; disabled; preset: enabled) Active: activating (auto-restart) (Result: exit-code) since Tue 2025-05-13 19:31:19 CST; > Process: 12272 ExecStart/usr/bin/ollama serve (codeexited, status1/FAI…

Spring AI 开发本地deepseek对话快速上手笔记

Spring AI Spring AI是一个旨在推进生成式人工智能应用程序发展的项目,Spring AI的核心目标是提供高度抽象化的组件,作为开发AI应用程序的基础,使得开发者能够以最少的代码改动便捷地交换和优化功能模块‌ 在开发之前先得引入大模型&#xf…

SpringBoot中的拦截器

SpringBoot中的拦截器 Filter 典型场景 全局鉴权/接口耗时统计 WebFilter("/*") public class CostFilter implements Filter {Overridepublic void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) {long start System.currentTimeMill…

半小时快速入门Spring AI:使用腾讯云编程助手CodeBuddy 开发简易聊天程序

引言 随着人工智能(AI)技术的飞速发展,越来越多的开发者开始探索如何将AI集成到自己的应用中。人工智能正在迅速改变各行各业的工作方式,从自动化客服到智能推荐系统,AI的应用几乎无处不在。Spring AI作为一种开源框架…

【PostgreSQL数据分析实战:从数据清洗到可视化全流程】金融风控分析案例-10.3 风险指标可视化监控

👉 点击关注不迷路 👉 点击关注不迷路 👉 点击关注不迷路 文章大纲 PostgreSQL金融风控分析之风险指标可视化监控实战一、引言二、案例背景三、数据准备(一)数据来源与字段说明(二)数据清洗 四、…