【算法萌新闯力扣】:环形链表及环形链表II

    力扣题目:环形链表及环形链表II

开篇

  今天是备战蓝桥杯的第26天和算法村开营第4天。挑选了链表的黄金关卡与大家分享。

题目一:环形链表

题目链接: 141.环形链表

题目描述在这里插入图片描述

方法一、哈希表

判断是否有环,可以利用哈希表,遍历的时候把节点放进去。当有节点在哈希表出现过时,证明存在环

public ListNode detectCycle(ListNode head){
ListNode pos = head;
Set<ListNode>visited = new HashSet<>();
while (pos =! null){
	if (visited.contains(pos)) return pos;
	else visited.add(pos);
	pos pos.next;
}
return null;
}

方法二、快慢指针

如果只用O(1)的空间,有没有其他方法?
快慢指针!这是判断是否有环最有效的方法。慢指针一次走一步,快指针一次走两步。如果快指针能走到表尾,则没有环。否则,快慢指针在环中绕圈的时候总会碰到一起。两者相碰作为判定存在环的条件

public boolean hasCycle(ListNode head){
if (head == null || head.next == null) return false;
ListNode fast = head, slow = head;
while(fast != null & fast.next != null){
	fast = fast.next.next;
	slow = slow.next;
	if (fast==slow)
		return true;
}
return false;
}

题目二:环形链表II

题目链接: 142.环形链表II

与上一题只有返回的内容不同
在这里插入图片描述

方法一、哈希表

可以利用哈希表,遍历的时候把节点放进去。当有节点在哈希表出现过时,该结点就是环的入口

public class Solution {
	public ListNode detectCycle(ListNode head) {
		ListNode node =head;
		Set<ListNode> set = new HashSet();
		while(node != null){
			if(set.contains(node)) return node;
			set.add(node);
			node = node.next;
		}
		return null;
	}
}

方法二、快慢指针(重点)

  这里的问题是如果知道了一定有入口,那么如何确定入口的位置呢?方法非常简单,但是要理解清楚有些难度。
  结论:先按照上面快慢方式寻找到相遇的位置(假设如下图中Z),然后将两指针分别放在链表头(X)和相遇位置(Z),并改为相同速度推进,则两
指针在环开始位置相遇(Y)
image.png

推导过程

1.假设一圈就遇到:
为了便于理解,我们首先假定快指针在第二次进入环的时候就相遇了.
此时的过程是:
(1)找环中相汇点。分别用fast、slow表示快慢指针,slow每次走一步,fast就走两步,直到在环中的某个位置相会,假如是图中的Z。
(2)第一次相遇:
那么我们可以知道fast指针走了a+b+c+b步,
slow指针走了a+b步
那么:2*(a+b)=a+b+c+b
所以a=c因此此时让slow从Z继续向前走,fast回到起点,两个同时开始走(两个每次都走一步),一次走一步那么它们最终会相遇在y点,正是环的起始点。
2.如果多圈后相遇
设链表中环外部分的长度为a,slow指针进入环后,又走了b的距离与fast相遇。此时,fast指针已经走完了环的n圈,因此它走过的总距离为:
Fast:a+n(b+c)+b=a+(n+1)b+nc
根据题意,任意时刻,fast指针走过的距离都为slow指针的2倍。因
此,我们有:
a+(n+1)b+nc=2(a+b)
由于b+c就是环的长度,假如为len,则:
a=c+(n-1)*len
这说明什么呢?说明相遇的时候快指针在环里已经转了(n-1)圈,如果
n==1就退化成了我们上面说的一圈的场景。假如n是2,3,4呢,这只
是说明当一个指针p1重新开始从head走的时候,另一个指针p2从Z点开
始,p1、p2共速时,两者会恰好在入口处相遇,只不过p2要先在环中转n-1圈。

public class Solution {
	public ListNode detectCycle(ListNode head) {
		ListNode fast = head, slow = head;
		while(fast != null && fast.next != null){
			if(slow.next == fast.next.next) break;
			slow = slow.next;
			fast = fast.next.next;
		}
		if(fast == null || fast.next == null) return null;
		ListNode node1 = head, node2 = slow.next;
		while(node1 != node2){
			node1 = node1.next;
			node2 = node2.next;
		}
		return node1;
	}
}

结语

  如果对这道题分享对您有所帮助,点个关注,为会每天更新力扣题的分享,与大伙儿一起进步!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

‘tsc‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件。

最近在用nodejs typescript 某游戏服务器在做一些研究 nodejs-tcs 问题描述&#xff1a; 1.使用命令npm install -g typescript安装typescript后&#xff0c;输入 tsc命令&#xff0c;一直报错 tsc 不是内部或外部命令&#xff0c;也不是可运行的程序 或批处理文件。 2.目…

算法面试题--树与对象数组的转化

1. Array -> Tree var arr [{ id: 12, parentId: 1, name: "朝阳区" },{ id: 241, parentId: 24, name: "田林街道" },{ id: 31, parentId: 3, name: "广州市" },{ id: 13, parentId: 1, name: "昌平区" },{ id: 2421, parentId:…

<Linux>(极简关键、省时省力)《Linux操作系统原理分析之存储管理(1)》(14)

[TOC](《Linux操作系统原理分析之存储管理》&#xff08;14&#xff09; 5 存储管理5.1 存储管理的目的和功能5.1.1 存储管理目的&#xff1a;5.1.2 存储管理的主要功能5.1.3 存储管理主要是对用户区进行管理 5.2 地址重定位5.2.1 作业的地址空间5.2.2&#xff0e;地址映射&…

Linux基本指令汇总

本专栏内容为&#xff1a;Linux学习专栏&#xff0c;分为系统和网络两部分。 通过本专栏的深入学习&#xff0c;你可以了解并掌握Linux。 &#x1f493;博主csdn个人主页&#xff1a;小小unicorn ⏩专栏分类&#xff1a;Linux从入门到精通 &#x1f69a;代码仓库&#xff1a;小…

UI自动化测试工具工作原理是怎样的?

随着软件开发的不断演进&#xff0c;保障软件质量成为了至关重要的一环。在这个过程中&#xff0c;UI自动化测试工具崭露头角&#xff0c;为开发团队提供了一种强有力的方式来确保应用程序的稳定性、功能性和兼容性。本文将深入探讨UI自动化测试工具的定义、工作原理以及其在提…

名字大却不中用的AI大模型,名不副实

这两天 OpenAI 团队&#xff08; ChatGPT 公司&#xff09;的戏比较多&#xff0c;两三天的功夫&#xff0c;剧情发展都超出了 OpenAI 首席科学家的预期&#xff0c;目前来看&#xff0c;微软还是最大的赢家。这是个引子&#xff0c;这个话题&#xff0c;网络上早已传烂了&…

InnoDB存储引擎中的锁

文章目录 概要一、需要解决的问题二、共享锁和独占锁1.1 锁定读1.2 表级别的共享锁、独占锁 三、行锁3.1 数据准备3.2 几种常见的行级锁3.3 行锁升级为表锁 概要 关于MySQL涉及到的锁&#xff0c;大致可以总结如下&#xff1a; MyISAM存储引擎在开发过程中几乎很少使用了&…

【重磅合作】九章云极DataCanvas公司与生态伙伴强强联手,构建人工智能强生态!

11月21日&#xff0c;在「筑基赋能 智向未来」九章云极DataCanvas大模型系列成果发布会上&#xff0c;九章云极DataCanvas公司与人工智能产业链上下游合作伙伴广东民营投资股份有限公司&#xff08;以下简称“粤民投”&#xff09;、西藏赛富合银投资有限公司&#xff08;以下简…

通过流量监控分析某个部门或客户端网络性能

在当今数字化时代&#xff0c;网络已经成为组织和企业不可或缺的基础设施之一。作为信息传输和数据交互的关键载体&#xff0c;网络的性能对于保障业务的稳定运行和提升工作效率至关重要。因此&#xff0c;对某个部门或客户端网络的性能进行分析和评估&#xff0c;有助于了解当…

vue2 el-table 封装

vue2 el-table 封装 在 custom 文件夹下面创建 tableList.vue直接上代码&#xff08;代码比较多&#xff0c;复制可直接用&#xff09; <template><div class"mp-list"><el-tableref"multipleTable"class"mp-custom-table":dat…

解决d3dcompiler_43.dll文件丢失的方法,最详细的d3dcompiler_43.dll修复指南

如果你的电脑出现了d3dcompiler_43.dll文件丢失的问题&#xff0c;你知道要怎么去解决么&#xff1f;其实要解决这个问题还是比较简单的&#xff0c;只要你了解清楚d3dcompiler_43.dll文件&#xff0c;那么就知道有多种不同的方法可以去解决它&#xff0c;下面我们一起来看看吧…

bodymovin:AE动画导出为JSONforMac/win中文版下载

对于动画制作爱好者和专业设计师来说&#xff0c;Adobe After Effects&#xff08;AE&#xff09;是一个强大的工具&#xff0c;可以创造出惊人的动画效果。然而&#xff0c;将这些动画导出为可交互的格式一直是一个挑战。现在&#xff0c;有了bodymovin&#xff0c;你可以轻松…

【C++初阶】:简单的图书管理系统(可保存,完整源代码)

图书管理系统 library.h #include<iostream> #include<string> #include<vector> using namespace std;/****************************************************************公共类**********************************************************************…

element-plus 使用密码输入框的自定义图标

<el-inputv-model"ruleFormPassword.newPassword"placeholder"请输入新密码":type"showPassword ? text : password":style"{ width: 360px }"><template #suffix><span class"input_icon" click"swit…

视频智能分析国标GB28181云平台EasyCVR加密机授权异常是什么原因?

国标GB28181视频汇聚/视频云存储/集中存储/视频监控管理平台EasyCVR能在复杂的网络环境中&#xff0c;将分散的各类视频资源进行统一汇聚、整合、集中管理&#xff0c;实现视频资源的鉴权管理、按需调阅、全网分发、云存储、智能分析等。 近期有用户选择使用加密机进行EasyCVR授…

在线 SQL 模拟器SQL Fiddle使用简介

在线 SQL 模拟器SQL Fiddle使用简介 本文可作为“SQL语言与SQL在线实验工具的使用” https://blog.csdn.net/cnds123/article/details/115038700 一文的补充。 有时候&#xff0c;我们想去验证 SQL语句&#xff0c;却缺少数据库环境&#xff0c;那该怎么办呢&#xff1f; 这…

【css】调整图片样式-铅笔画-以及其它

[css]调整图片样式-铅笔画-以及其它 在这个网址下有很多实例&#xff0c;尝试了其中几个&#xff0c;成功实现的对半分。使用Micsoft&#xff0c;估计是不支持一些特性导致的。 <!DOCTYPE html> <html lang"en"> <head><meta charset"UT…

微信公众号扫码授权登录源码 / PHP微信扫码关注公众号并授权登录源码

源码简介&#xff1a; 在当今的互联网时代&#xff0c;微信公众号已成为众多企业与用户之间进行交流和沟通的重要工具&#xff0c;其中包括用户的登录认证。通过关注公众号登录&#xff0c;不仅可以为公众号带来流量&#xff0c;还能够实现用户与公众号粉丝之间的一一对应关系…

ubuntu下训练自己的yolov5数据集

参考文档 yolov5-github yolov5-github-训练文档 csdn训练博客 一、配置环境 1.1 安装依赖包 前往清华源官方地址 选择适合自己的版本替换自己的源 # 备份源文件 sudo cp /etc/apt/sources.list /etc/apt/sources.list_bak # 修改源文件 # 更新 sudo apt update &&a…

深度解析Python复合赋值运算符

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 在Python中&#xff0c;复合赋值运算符是编程旅程中的得力助手。这些简洁而强大的运算符&#xff0c;如、-、*&#xff0c;不仅让代码更具可读性&#xff0c;而且提高了开发效率。从基础的数值操作到字符串和列表…
最新文章