快慢指针的应用

快慢指针的原理

快慢指针是利用两个指针移动速度的不一样,实现一些有趣的追击行为。就像上学时求解的那些操场上的追击问题一样。

问题1:判断两个链表是否相交。(链表不存在环结构)

形如:

 方法:循环第一个链表到最后一个节点,记下该节点的指针P1,然后循环第二个链表到最后一个节点,然后将这个节点的指针和P1做比较,如果相同则相交,否则就不相交。

问题2:判断两个链表是否相交。(链表可能存在环结构)

形如:

方法:先使用快慢指针遍历链表判断链表是否带环。

1、如果都不带环,则判断最后的节点指针是否相同,相同就说明相交,不相同就不相交。

2、一个带环一个不带环,则两个链表必然不相交。

3、两个都带环,则判断其中一个链表的快慢指针相遇的节点是否在另外一个链表上,在说明相交,不在说明不相交。

问题3:一个单链表,判断是否存在环

方法:采用“快慢指针”的方法。设置两个指针fast和slow,开始的时候两个指针指向链表头head,然后每次操作slow向前走一步(slow=slow->next),fast每次向前走两步(fast=fast->next->next)。

由于fast比slow快,如果有环,则fast一定先进入环,slow后进入环。然后在环内它们必然在一定步骤必然相遇。如果没有环,那么fast就会遇到null。

if (slow != null && fast->next != null)
{slow = slow->next;fast = fast->next->next;if (slow == fast)// 有环
}
else
{// 无环
}

 问题4:一个存在环的单链表,找出环的入口点

分析一下:当slow刚到达环的入口处时,fast在环上的任意一个点处,此时fast距离slow设为x,x一定是小于等于环的长度r的。那么当slow再走x步后,fast必然就和slow相遇了(刚开始fast相距slow为x,slow又走了x,此时fast就走了2*x,则刚好遇上)。如上图所示。

从上面的分析知道,当fast和slow相遇时,slow走的距离x是小于等于r的,现在假设:fast已经在环内循环了n(1 <= n)圈。slow走了s步,fast就走了2*s步,由于fast走过的步数 = s + n*r。

则有下面的等式:

2\ast s=s+n\ast r ;(1) \newline => s = n*r;(2) \newline

如果整个链表的长度是L,入口和相遇点距离是x,起点到入口点的距离是a,则有:

a+x = s = n\ast r;(3)   由(2)推出。

a+x = (n-1)\ast r+r = (n-1)\ast r + (L-a);(4)  由环的长度=链表总长度-起点到入口的距离求出。

a = (n-1)\ast r + (L-a-x);(5)

分析等式(5),(L-a-x) 是相遇点到入口的距离,再结合上图分析可知,当两个指针一个指针在链表头另一个在相遇点同时出发,每次走一步,当指向头指针的走到入口处时,相遇点的指针也刚好走到入口处。

代码如下:

Node* findLoopStart(Node *head)
{Node *fast, *slow;slow = fast = head;while (slow != NULL && fast->next != NULL){slow = slow->next;fast = fast->next->next;if (slow == fast) break;}if (slow == NULL || fast->next == NULL) return NULL; //没有环,返回NULL值Node * ptr1 = head; //链表开始点Node * ptr2 = slow; //相遇点while (ptr1 != ptr2){ptr1 = ptr1->next;ptr2 = ptr2->next;}return ptr1; //找到入口点
}

扩展问题:

1、寻找链表的中点位置

2、寻找链表的倒数第k的位置

 

 

 

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

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

相关文章

谷歌开源专业代码模型:对硬件要求低,性能超强!

谷歌发布了面向企业、开发人员的全新代码模型Code Gemma&#xff0c;一共有基础预训练、指令微调和快速推理三个版本。 Code Gemma是基于谷歌在今年2月发布的Gemma模型之上开发而成。其参数很小只有20亿和70亿两种&#xff0c;但使用了超过5000亿tokens的代码、数学、文本等数…

vue2和vue3的v-if与v-for优先级对比

Vue.js 中使用最多的两个指令就是 v-if 和 v-for&#xff0c;因此我们可能会想要同时使用它们。虽然官方不建议这样做&#xff0c;但有时确实是必须的&#xff0c;我们来了解下他们的工作方式&#xff1a; 在 vue 2.x 中&#xff0c;在一个元素上同时使用 v-if 和 v-for 时&am…

【第七届openGauss技术文章征集】 openGauss新版本征文活动来啦!

活动背景 2024年3月30日&#xff0c;openGauss 6.0.0版本正式上线&#xff0c;该版本与之前版本特性功能保持兼容&#xff0c;在内核能力、DataPod三层资源池化架构、DataKit数据全生命周期管理平台、生态兼容性等方面全面增强。&#xff08;下方【点击原文】即可查看更多【新…

【GPT-4最新研究】GPT-4与科学探索:揭秘语言模型在科学领域的无限可能

各位朋友们&#xff0c;你们知道吗&#xff1f;自然语言处理领域最近取得了巨大的突破&#xff01;大型语言模型&#xff08;LLM&#xff09;的出现&#xff0c;简直就像打开了新世界的大门。它们不仅在语言理解、生成和翻译方面表现出色&#xff0c;还能涉足许多其他领域&…

【绘图案例-屏幕截图 Objective-C语言】

一、屏幕截图 1.接下来,我们来说这个屏幕截图, 1.看一下我们的ppt, 屏幕截图呢,核心代码,也就是一句话, 我们看ppt上说,有时候需要从屏幕上的某一个View啊,截取一个图片出来,然后呢,这个里边儿,它举的一个例子,就是这个东西,捕鱼达人的这个图片,实际上,屏幕截图…

突破界限:LangChain 引领 AI 应用构建的新时代

前言 在上一篇文章中我们对 ChatWithPDF 的方案设计进行了整体的概览&#xff0c;现在细化下整体流程&#xff0c;如下图所示&#xff1a; 针对上面的流程&#xff0c;我们思考&#x1f914;一下会面临的问题&#xff1a; 如何读取 PDF 中的内容&#xff1f;&#xff08;肯定…

一些重新开始面试之后的八股文汇总

一、内存中各项名词说明 1、机器内存概念说明 linux中的free命令可以查看机器的内存使用情况&#xff0c;vmstat命令也可以 其中不容易被理解的是&#xff1a; 内存缓冲/存数&#xff08;buffer/cached&#xff09; 1.buffers和cache也是RAM划分出来的一部分地址空间 2.buff…

如何利用逻辑引擎的对象变量节点优化表单数据处理?

JVS逻辑引擎-对象变量节点 概述 对象变量是面向对象编程中的一个重要概念。在编程中&#xff0c;对象变量用于存储对象的引用。在Java中&#xff0c;使用“类名变量名”可以创建一个对象变量&#xff0c;但此时对象变量本身并没有任何值。要赋予对象变量具体的值&#xff0c;…

Type-C接口PD取电IC6500

一、引言 随着科技的不断进步&#xff0c;移动设备已经成为我们日常生活中不可或缺的一部分。其中&#xff0c;电源管理对于确保设备的稳定运行和延长电池寿命至关重要。Type-C接口作为现代移动设备的主要电源和数据接口&#xff0c;其高效、便捷的特性得到了广泛应用。而Powe…

基于springboot实现音乐网站管理系统项目【项目源码+论文说明】计算机毕业设计

基于SpringBoot实现音乐网站管理系统演示 摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了音乐网站的开发全过程。通过分析音乐网站管理的不足&#xff0c;创建了一个计算机管理音乐网站的方案。文章介绍了音乐…

李彦宏:开源模型会越来越落后

李彦宏&#xff1a;开源模型会越来越落后 昨天听完的李总讲座 大家以前用开源觉得开源便宜&#xff0c;其实在大模型场景下&#xff0c;开源是最贵的。所以&#xff0c;开源模型会越来越落后。 ——李彦宏 至于开源还是闭源&#xff0c;这和企业的利益息息相关。 随着科技的迅猛…

新品上市|水深测量专家 HD-680双变频测深仪

自动跟踪 一键测量 测深参数自动调节&#xff0c;换能器内置温度传感器&#xff0c;声速自动解算&#xff0c;提升数据精度&#xff0c;解放双手&#xff0c;提高测量效率。 高低频结合可实时显示淤泥厚度 HD-680双变频测深仪高低频双通道同时工作&#xff0c;全新升级的双频测…

如何使用WinSCP通过固定公网TCP地址实现远程连接内网设备传输文件

文章目录 1. 简介2. 软件下载安装&#xff1a;3. SSH链接服务器4. WinSCP使用公网TCP地址链接本地服务器5. WinSCP使用固定公网TCP地址访问服务器 1. 简介 ​ Winscp是一个支持SSH(Secure SHell)的可视化SCP(Secure Copy)文件传输软件&#xff0c;它的主要功能是在本地与远程计…

VIN车辆识别代码查询API接口是什么

VIN车辆识别代码查询API接口又叫VIN码查询接口、VIN码识别接口、车辆VIN码解析接口、车架号查询车辆信息接口&#xff0c;通过输入车辆VIN识别码&#xff08;车架号&#xff09;获取车辆参数信息&#xff0c;返回车辆品牌、车型、油耗、车身形式、排量等等。那么这个接口如何对…

什么是交叉连接:全面概述

交叉连接是数据中心上下文中使用的术语&#xff0c;指的是在两个单独的硬件单元之间建立直接链接所需的物理电缆和连接。这些连接在促进数据中心内各个组件之间的高效和安全通信方面发挥着至关重要的作用。通过在硬件单元之间创建专用网络链接&#xff0c;交叉连接消除了对基于…

Meta因露骨AI图片陷入困境

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

硬件?、嘉立创EDA画PCB规则设计

1、打开规则设计 设置单位为mil 点击全部 将安全距离设置为8mil&#xff0c;这个8mil是目前很多生产PCB的工厂可以做的&#xff0c;如果距离设置的更小也就是性能要求更高&#xff0c;相应的生产成本也高元件到元件的距离设置为20mil 2、设置导线的宽度规则&#xff0c;可以对v…

敏捷——登录校验/管理事项/Javaweb/后端/Springboot

勋的要求 1 登录后 后端返回一个token 2 数据库 用户表 事项表 用户表&#xff1a;用户名 密码 用户标识&#xff08;id&#xff09; 1 zhangsan 123456 2 zhangsan2 123456 3 zhangsan3 123456 事项表&#xff1a…

ccfcsp201409-3 字符串匹配

#include <bits/stdc.h> using namespace std; string s; int y, n; string o[105]; bool check(char a, char b) { // 大小写不敏感if (a b || a - a b - A || a - A b - a){return true;}return false; } int main() {cin >> s;cin >> y; // 0不敏感1敏…

挣钱新玩法,一文带你掌握流量卡推广秘诀

手机流量卡推广项目是什么&#xff1f;听名字我相信大家就已经猜出来了&#xff0c;就是三大运营商为了开发新用户&#xff0c;发起的有奖推广活动&#xff0c;也是为了长期黏贴用户。在这个活动中&#xff0c;用户通过我们的渠道&#xff0c;就能免费办理低套餐流量卡&#xf…