链表成环或多分枝问题

news2024/10/7 7:10:23

问题概述

这类问题主要和数论结合到一起。

这类问题主要的解决技巧就是画图,跟着图来写代码,不然代码5分钟,调试2小时。

因为每个节点可以指向下一个节点,那么两个节点就可以指向同一个节点;或者链表的末尾节点指向链表前面的节点。这两种情况分别对应了多分枝和成环。那么针对这两种问题我们展开讨论。

再此之前几个需要掌握的算法

快慢指针

快慢指针就是我们在遍历链表的时候,需要创建一个指针向链表的末尾移动。而我们可以定义一个快指针和一个慢指针,一个走一个节点,一个走x个节点。

那么其中最典型的题目就是返回链表的中间节点,如果是偶数个节点就返回中间靠后的节点。

那么我们让指针可以一个走一个节点一个走两个节点,当快指针走到末尾的时候,我们的慢指针也就到中间了

我们通过画图看到两种fast指针到达最远的停止位置时候,我们的slow都可以到达所需点

看代码:

也是非常的快。时间复杂度是0(N);

我们再看一个不同的快慢指针;

那么这题需要一点逆向思维,肯定fast指针在末尾,slow指针在k处,那么将slow指针退回原点,fast指针就是离原点k个节点的位置。那么我们就知道如何做了。先让fast指针走k个节点,再让两个节点同时运动到末尾。

链表的逆置

链表的逆置很好理解,就是将指的方向反过来。链表逆置有很多种方法,我在这里一一列举出来

第一种就是对原链表进行操作,操作就是要建立三个指针begain,mid,end,不然无法完成:前两个指针负责交换节点指向的方向,后一个是跳向下一个指针。

我们想象一下结束的情况,end指针为NULL此时就结束了,但是此时的begain和mid还没操作

不用说我们直接看代码:

也是非常的快

我们还有一种方法就是,头插一个新链表出来。

这两种算法的综合运用

这个题我想到了两种方法第一种就是用上面的算法,第二种就是用栈来进行。

第一种

我们先找到中间节点,然后我们再将中间节点后面的链表进行逆置,最后我们再从第一个节点和中间节点来同时向后比较。

第二种

我们可以用栈储存前面一半的数据,然后出栈和后面的数据进行比较。

引例

我们j继续通过几个力扣题来认识这类问题。

例一:相交链表

这个就是我们第一个题,属于多分枝.

这个题我有两个思路。

第一个是先遍历B,将所有B的节点存起来,再逆置A,再遍历B与开始的B节点进行比较。第一个不同的节点就是我们要的答案。

这里请大家自己实现。

我们再说另一种方案:

这个方法我们要用到快慢指针。我们先要讲两个链表遍历一遍,统计他们的长度,然后找到并排的位置,从这个位置开始遍历,这样我们遍历下去如果遇到重复的节点就能找到了。

例二:环形链表一

这个就仅仅是判断是否为环链表,我们可以使用可快慢指针来进行操作。一个指针在环里面走一格一个节点,一个指针走两个节点,如果是环那么终究会出现快指针追到慢指针的情况。

我们要先让指针运动再判断,否则第一次就跳出循环返回true了。

如果出现了NULL指针,肯定就不是循环链表,退出循环返回false;

这里我有一个问题:如果我们不要快指针为2倍,而是3被或者N倍速,那么这两个指针是否还能相遇呢?

我们来进行数学讨论:

先从3倍开始:

我们再看每次移动的时候,两者的相对位移会减小2个单位。那么有3t=P+t,就有2t=P,那么我们必须保证P是偶数才能够搞好追上。那么如果我们快指针是超过了怎么办呢(没追上就是超过的前一步,所以只用讨论快指针追上的情况)。我们发现只有一种追上的情况,就是快指针刚好比慢指针多一个单位。那么我们下一次要讨论的就是C-1是否是奇数还是偶数,如果是偶数,那么下一次就可以追上了,如果是奇数,那么还是会出现快指针超过慢指针一个单位的情况。总结的说:我们要保证1:3的速度能够刚好追上,就必须保证P为偶数或者C-1为偶数。

那么3倍速都有这么多不确定,那么后面的N倍速就更不用说了。

所以我们选择两倍速来保证100%的能追上。

例三:环形链表二

这个题目有两种解法。我们先说比较容易想到的解法

解法一

我们先用上面环形链表一的算法来判断一下是否为环形链表,然后还会得到一个相交的节点。那么我么可以从这个节点断开,那么就将这个题目变成“相交链表”的题目了。

解法二

这个方法我们可能不容易想到:

让两个slow指针同时从fast和slow相交的点和起点开始走。两个slow的交点就是我们要找的。

具体证明如下:

这个 L=(X-1)C+N的表达式有什么用呢?

如果我们用slow来走一遍就是:起始点的slow走到相交点的时候,我们k点的slow刚好走了x-1圈加上n的长度。那么就刚好在交点相交。

那么我们试着写一下代码:

能够熟练掌握这几个估计能够解决这一类的问题了。

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

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

相关文章

SIC知识(9)--长晶炉的技术难点

长晶炉是碳化硅晶体生长的核心设备,与传统晶硅级长晶炉有相同性,炉子结构不是非常复杂,主要由炉体、加热系统、线圈传动机构、真空获得及测量系统、气路系统、降温系统、控制系统等组成,其中的热场和工艺条件决定了碳化硅晶体的质…

多微信管理不过来?你需要一个微信神器

很多企业都在面临以下几个问题: 1、希望进行微信营销转型,但是不知道如何入手; 2、拥有多个微信号,但不想拿着多台手机,希望能够集中管理所有微信号; 3、希望使用app替代传统的营销体系,并确…

【Flutter】App内购支付集成 Google和Apple支付和服务器验证全流程

Flutter支付集成 前言: 以谷歌内购为例,我们需要做的总共为三步 需要在谷歌市场配置商品,设置测试渠道,配置开发者账号,设置对应权限。配置完商品之后,如何在 Flutter 中获取到商品,购买指定…

Leetcode—377. 组合总和 Ⅳ【中等】

2024每日刷题&#xff08;124&#xff09; Leetcode—377. 组合总和 Ⅳ 算法思想 实现代码 class Solution { public:int combinationSum4(vector<int>& nums, int target) {vector<unsigned long long>dp(target 1);dp[0] 1;for(int i 1; i < target;…

软件实施方案Word原件2024(全套软件资料包)

1.概述 2.项目介绍 3.项目实施 4.实施计划 5.人员培训 6.项目验收 7.售后服务 8.项目保障措施 软件资料清单列表部分文档&#xff08;全套可获取&#xff09;&#xff1a; 工作安排任务书&#xff0c;可行性分析报告&#xff0c;立项申请审批表&#xff0c;产品需求规格说明书…

Angular中组件之间的传值

Angular中组件之间的传值 文章目录 Angular中组件之间的传值前言一、父亲向儿子传值二、儿子向父亲传值三、爷爷向孙子传值四、兄弟之间的传值 前言 Angular的组件是构成应用的基础单元&#xff0c;它们封装了HTML模板、TypeScript代码以及CSS样式&#xff0c;以实现特定的功能…

Windows10系统中CANoe字体异常问题解决办法

Windows10系统中CANoe/CANalyzer字体异常问题解决办法 一、问题: 在Windows10中文系统中,CANoe/CANalyzer的一些窗口会显示异常的字体,大部分其他窗口的字体却是正常的? 异常的字体如下: 二、问题说明 CANoe/CANalyzer的开发过程中使用了多种对话框技术。一些对话框使…

Qt——入门基础

目录 Qt入门第一个应用程序 main.cpp widget.h widget.cpp widget.ui .pro Hello World程序 对象树 编辑框 按钮 Qt 窗口坐标系 Qt入门第一个应用程序 main.cpp 这就像一开始学语言时都会打印一个“Hello World”一样&#xff0c;我们先来看看创建好一个项目后&…

互联网十万个为什么之什么是云计算

云计算是一种通过互联网提供计算资源和服务的技术。它允许用户随时随地访问和使用云平台上的数据、软件和硬件资源。在数字化时代&#xff0c;互联网已经成为基础设施。云计算使得数据中心能够像一台计算机一样去工作。通过互联网将算力以按需使用、按量付费的形式提供给用户&a…

[Kubernetes] Rancher 2.7.5 部署 k8s

server: 192.168.66.100 master: 192.168.66.101 node1: 192.16t8.66.102 文章目录 1.rancher server 安装docker2.部署k8s3.kubeconfig 1.rancher server 安装docker 所有主机开通ipv4 vi /etc/sysctl.conf#加入 net.ipv4.ip_forward 1#配置生效 sysctl -prancher-server开…

什么是企业出海?

本文节选自Odoo亚太金牌服务机构【开源智造】所编写的《企业数字化百科大全》如需获取完整的知识内容&#xff0c;请至开源智造官网免费获取。感谢网友一键三连&#xff1a;点赞、转发、收藏&#xff0c;您的支持是我们最大的前进动力&#xff01; 企业出海是什么意思&#xff…

压力测试-JMeter常用插件、服务器硬件监控

1.写在前面 在前一篇文章中&#xff0c;我们已经对jmeter有了一个入门的学习。 掌握了JMeter安装、入门、结果分析等内容&#xff0c;详情可查看这里&#xff1a;压力测试-JMeter安装、入门、结果分析 对于jmeter默认的插件&#xff0c;往往不太够&#xff0c;例如&#xff…

机器学习实践:超市商品购买关联规则分析

第2关&#xff1a;动手实现Apriori算法 任务描述 本关任务&#xff1a;编写 Python 代码实现 Apriori 算法。 相关知识 为了完成本关任务&#xff0c;你需要掌握 Apriori 算法流程。 Apriori 算法流程 Apriori 算法的两个输人参数分别是最小支持度和数据集。该算法首先会生成所…

LeetCode-DFS-树类-简单难度

关于二叉树的相关深度优先遍历类题目&#xff0c;重点在于掌握最基本的前中后序遍历&#xff0c;大多数题目都在围绕这套逻辑&#xff0c;找到处理节点的时机&#xff0c;以及停止遍历的条件&#xff0c;即可顺利完成。 二叉树前中后序遍历模板 所谓前中后序&#xff0c;指的…

好久不见,回来看看七年前的你

今天在网上搜东西&#xff0c;突然想到之前在网上记录的点滴成长&#xff0c;回来看看~ 来看看那些年走过的路&#xff0c;小伙还挺真实&#xff0c;有些想法~ 那时&#xff0c;一起在网上记录文字的人&#xff0c;也都慢慢失去了联系~ 确实&#xff0c;深有感触&#xff0c;…

【论文阅读笔记】MAS-SAM: Segment Any Marine Animal with Aggregated Features

1.论文介绍 MAS-SAM: Segment Any Marine Animal with Aggregated Features MAS-SAM&#xff1a;利用聚合特征分割任何海洋动物 Paper Code(空的) 2.摘要 最近&#xff0c;分割任何模型&#xff08;SAM&#xff09;在生成高质量的对象掩模和实现零拍摄图像分割方面表现出卓越…

超疏水TiO₂纳米纤维网膜的良好性能

超疏水TiO₂纳米纤维网膜是一种具有特殊性能的材料&#xff0c;它结合了TiO₂的光催化性能和超疏水表面的自清洁、防腐、防污等特性。这种材料在防水、自清洁、油水分离等领域具有广阔的应用前景。 制备超疏水TiO₂纳米纤维网膜的过程中&#xff0c;通过精确控制纺丝溶液的成分…

BFS Ekoparty 2022 -- Linux Kernel Exploitation Challenge

前言 昨天一个师傅给了我一道 linux kernel pwn 题目&#xff0c;然后我看了感觉非常有意思&#xff0c;题目也不算难&#xff08;在看了作者的提示下&#xff09;&#xff0c;所以就花时间做了做&#xff0c;在这里简单记录一下。这个题是 BFS Lab 2022 年的一道招聘题&#…

【优选算法】——Leetcode——202—— 快乐数

目录 1.题目 2. 题⽬分析: 3.简单证明&#xff1a; 4. 解法&#xff08;快慢指针&#xff09;&#xff1a; 算法思路&#xff1a; 补充知识&#xff1a;如何求⼀个数n每个位置上的数字的平⽅和。 总结概括 5.代码实现 1.C语言 2.C 1.题目 202. 快乐数 编写一个算法来…

国家电网某地电力公司网络硬件综合监控运维项目

国家电网某地电力公司是国家电网有限公司的子公司&#xff0c;负责当地电网规划、建设、运营和供电服务&#xff0c;下属多家地市供电企业和检修公司、信息通信公司等业务支撑实施机构。 项目现状 随着公司信息化建设加速&#xff0c;其信息内网中存在大量物理服务器、存储设备…