当前位置: 首页 > news >正文

【算法系列-链表】链表相交 环形链表II

【算法系列-链表】链表相交&环形链表

文章目录

  • 【算法系列-链表】链表相交&环形链表
    • 1. 链表相交
      • 1.1 思路分析🎯
      • 1.2 解题过程🎬
      • 1.3 代码示例🌰
    • 2. 环形链表II
      • 2.1 思路分析🎯
      • 2.2 代码示例🌰

1. 链表相交

【题目链接】 LeetCode 面试题 02.07.链表相交

1.1 思路分析🎯

这道题最直接的思路就是:找到两条链表中最长的那条,然后定义一个指针从这条最长链表的头节点开始遍历 ,遍历两条链表的长度的差值后,此时定义两个指针开始同步各自遍历两条链表,找到相同的结点则返回,直到 找到节点其中一个链表被遍历完则退出循环,返回null

1.2 解题过程🎬

先定义指针 cur1 和 cur2 用来分别遍历两条链表,分别计算出两条链表各自的长度 len1、len2;

之后进行判断,选出最长的那条链表进行循环遍历:

从头节点开始,让指针走到与短链表头节点平行的位置(链表长度不等时,长链表超出短链表前面的部分是不会相交的,所以要排除掉)

之后从这个位置进行同步遍历,直到找到交点 或 其中一条链表已经遍历完,退出循环,返回结果

1.3 代码示例🌰

public class Solution {public ListNode getIntersectionNode(ListNode headA, ListNode headB) {ListNode cur1 = headA;ListNode cur2 = headB;int len1 = 0, len2 = 0;while (cur1 != null) {len1++;cur1 = cur1.next;}while (cur2 != null) {len2++;cur2 = cur2.next;}cur1 = headA;cur2 = headB;if (len1 > len2) {for (int i = 0;i < len1 - len2;i++) {cur1 = cur1.next;}}else {for (int i = 0;i < len2 - len1;i++) {cur2 = cur2.next;}}while (cur1 != null && cur2 != null) {if (cur1 == cur2) {return cur1;}cur1 = cur1.next;cur2 = cur2.next;}return null;}
}

这里还有一种解题思路:

定义两个指针让它们对每条链表都依次进行遍历,即 cur1遍历完链表A后就遍历链表B,cur2遍历完链表B后就遍历链表A,直到二者相遇,返回的cur1就是交点(若 cur1 与 cur2 都为空也能退出循环并返回),代码可以说非常简洁优雅,如下:

public class Solution {public ListNode getIntersectionNode(ListNode headA, ListNode headB) {ListNode cur1 = headA;ListNode cur2 = headB;while (cur1 != cur2) {cur1 = (cur1 != null ? cur1.next : headB);cur2 = (cur2 != null ? cur2.next : headA);}return cur1;}
}

2. 环形链表II

【题目链接】LeetCode 142 环形链表II

2.1 思路分析🎯

这道题可以利用快慢指针来解决问题,同时需要解决两个关键性的问题:

  1. 是否有环
  2. 有环快慢指针相遇时来找入口

如何判断是否有环,可以通过遍历快慢指针来找:

当 fast != null && fast.next != null 时,让fast走两步,slow走一步,这样循环遍历下去,若存在环则fast指针一定能够追上slow指针(前提是fast每次只走两步,若fast走三步则可能会跳过slow);

在这里插入图片描述

fast走两步,slow走一步,最后能够在环里相遇:

在这里插入图片描述

快慢指针相遇后,接下来就能够来找入口了,这里涉及到了一点数学知识(换算):

  • 设 从头节点开始到入口的长度为 x;
  • 设 从入口节点到两个指针相遇的位置节点的距离为 y;
  • 设 相遇节点到环形入口的距离为 z;

在这里插入图片描述

在快慢指针相遇时:

  • fast指针走过的长度为 x + y + n * (y + z),n为走过的圈数且大于等于1;

  • slow指针走过的长度为 x + y;

且快指针每次走的长度为慢指针的两倍,即 2 * (x + y) = x + y + n * (y + z),两边同时消掉一个 x + y,则:

x + y = n * (y + z) => x = n * (y + z) - y;此时消掉一个(y + z)来与y进行抵消,可以得到:x = (n - 1)(y + z) + z;

且n >= 1,所以当n等于1时,x = z,所以 从头节点开始到入口的长度 = 相遇节点到环形入口的距离!!

得到上述结论后,通过定义两个指针分别从头节点和快慢指针相遇节点开始遍历:

在这里插入图片描述

直到二者相遇将此时的位置返回即可:

在这里插入图片描述

2.2 代码示例🌰

public class Solution {public ListNode detectCycle(ListNode head) {ListNode fast = head;ListNode slow = head;while (fast != null && fast.next != null) {fast = fast.next.next;slow = slow.next;if (fast == slow) {ListNode index1 = fast;ListNode index2 = head;while (index1 != index2) {index1 = index1.next;index2 = index2.next;}return index1;}}return null;}
}

以上便是对链表相交&环形链表II类型题的介绍了!!后续还会继续分享其它算法系列内容,如果这些内容对大家有帮助的话请给一个三连关注吧💕( •̀ ω •́ )✧( •̀ ω •́ )✧✨

相关文章:

【算法系列-链表】链表相交 环形链表II

【算法系列-链表】链表相交&环形链表 文章目录 【算法系列-链表】链表相交&环形链表1. 链表相交1.1 思路分析&#x1f3af;1.2 解题过程&#x1f3ac;1.3 代码示例&#x1f330; 2. 环形链表II2.1 思路分析&#x1f3af;2.2 代码示例&#x1f330; 1. 链表相交 【题目…...

使用 Go 和 Gin 框架构建简单的用户和物品管理 Web 服务

使用 Go 和 Gin 框架构建简单的用户和物品管理 Web 服务 在本项目中&#xff0c;我们使用 Go 语言和 Gin 框架构建了一个简单的 Web 服务&#xff0c;能够管理用户和物品的信息。该服务实现了两个主要接口&#xff1a;根据用户 ID 获取用户名称&#xff0c;以及根据物品 ID 获…...

【VUE】双端比较算法

假设我们有两个虚拟节点 oldVnode 和 newVnode&#xff0c;它们分别对应的DOM结构为&#xff1a; 我们需要将 oldVnode 更新为 newVnode&#xff0c;这时就可以使用双端比较算法了。算法本质上是将新旧节点进行一次交叉比较&#xff0c;尽可能地重复使用已有的节点来达到最小…...

跨界的胜利:机器学习与神经网络的物理之光

近日&#xff0c;2024年诺贝尔物理学奖颁发给了机器学习与神经网络领域的研究者&#xff0c;这是历史上首次出现这样的情况。这项奖项原本只授予对自然现象和物质的物理学研究作出重大贡献的科学家&#xff0c;如今却将全球范围内对机器学习和神经网络的研究和开发作为了一种能…...

容器化技术:Docker的基本概念和使用

在现代软件开发和运维中&#xff0c;容器化技术已经成为一种不可或缺的工具。Docker作为容器化技术的代表&#xff0c;以其轻量级、可移植性和隔离性等特点&#xff0c;赢得了广泛的关注和应用。本文将详细介绍Docker的基本概念和使用方法&#xff0c;帮助读者快速上手Docker容…...

EcoVadis认证内容有哪些?EcoVadis认证申请流程?

EcoVadis认证是一个国际性的可持续发展评估平台&#xff0c;旨在帮助全球企业和供应链评鉴其在环境、社会和治理&#xff08;ESG&#xff09;方面的表现。该认证框架由法国的检验、认证和检测机构必维集团&#xff08;Bureau Veritas&#xff09;创建&#xff0c;得到了众多跨国…...

Windows 搭建 Gitea

一、准备工作 1. 安装 Git&#xff1a;Gitea 依赖 Git 进行代码管理&#xff0c;所以首先需要确保系统中安装了 Git。 下载地址&#xff1a;https://git-scm.com/downloads/win 2. 安装数据库&#xff08;可选&#xff09; 默认情况下&#xff0c;Gitea 使用 SQLite 作为内…...

嵌入式面试——FreeRTOS篇(五) 事件标志组

本篇为&#xff1a;FreeRTOS事件标志组篇 1、事件标志组介绍 答&#xff1a; 事件标志位&#xff1a;用一个位&#xff0c;来表示事件是否发生。 事件标志组是一组事件标志位的合集&#xff0c;可以简单的理解事件标志组&#xff0c;就是一个整数。 2、事件标志组的特点 答&am…...

智能听诊器:宠物健康管理的革命

智能听诊器不仅仅是一个简单的监测工具&#xff0c;它代表了宠物健康管理的一次革命。通过收集和分析宠物的生理数据&#xff0c;智能听诊器能够帮助宠物主人和医生更好地理解宠物的健康需求&#xff0c;从而提供更加个性化的护理方案。 智能听诊器通过高精度的传感器&#xf…...

dfs +剪枝sudoku———poj2676

目录 前言 lowbit函数 数独 suduku 问题描述 输入 输出 问题分析 子网格位置 优化搜索顺序剪枝1 优化搜索顺序剪枝2 可行性剪枝 代码 前言 lowbit函数 这是一个利用二进制位运算取出二进制数最后一位’1‘的函数 数独 数独大家肯定都玩过&#xff0c;…...

机器学习:关联规则:Apriori算法、FP - Growth算法的原理、应用场景及优缺点介绍

一、关联规则算法概述 关联规则挖掘是数据挖掘中的一个重要任务&#xff0c;用于发现数据集中不同项之间的关联关系。 二、Apriori算法 原理 频繁项集生成&#xff1a;Apriori算法基于一个先验原理&#xff0c;即如果一个项集是频繁的&#xff0c;那么它的所有子集也是频繁的…...

从0开始深度学习(7)——线性回归的简洁实现

在从0开始深度学习&#xff08;5&#xff09;——线性回归的逐步实现中&#xff0c;我们手动编写了数据构造模块、损失函数模块、优化器等&#xff0c;但是在现代深度学习框架下&#xff0c;这些已经包装好了 本章展示如果利用深度学习框架简洁的实现线性回归 0 导入头文件 im…...

【网络安全 | Java代码审计】华夏ERP(jshERP)v2.3

未经许可,不得转载。 文章目录 技术框架开发环境代码审计权限校验绕过SQL注入Fastjson反序列化命令执行存储型XSS越权/未授权重置密码越权/未授权删除用户信息越权/未授权修改用户信息会话固定安全建议项目地址:https://github.com/jishenghua/jshERP 技术框架 核心框架:Sp…...

Setting the value of ‘*‘ exceeded the quota

H5之localStorage限额报错quota_exceeded the quota-CSDN博客 Uncaught DOMException: Failed to set a named property on Storage: Setting the value of background exceeded the quota. 超出了 localStorage 的最大长度。...

前端页面模块修改成可动态生成数据模块——大部分数据为GPT生成(仅供学习参考)

前端页面模块修改成可动态生成数据模块&#xff1a; 这些案例展示了如何通过Blade模板将前端页面模块变成可动态生成的模板。通过巧妙使用Blade语法、控制结构、CSS/JS分离、组件复用等技巧&#xff0c;可以大大提高代码的灵活性和复用性。在Laravel的Controller中准备好数据并…...

5.错误处理在存储过程中的重要性(5/10)

错误处理在存储过程中的重要性 引言 在数据库编程中&#xff0c;存储过程是一种重要的组件&#xff0c;它允许用户将一系列SQL语句封装成一个单元&#xff0c;以便重用和简化数据库操作。然而&#xff0c;像任何编程任务一样&#xff0c;存储过程中的代码可能会遇到错误或异常…...

【WebGis开发 - Cesium】如何确保Cesium场景加载完毕

目录 引言一、监听场景加载进度1. 基础代码2. 加工代码 二、进一步封装代码1. 已知存在的弊端2. 封装hooks函数 三、使用hooks方法1. 先看下效果2. 如何使用该hooks方法 三、总结 引言 本篇为Cesium开发的一些小技巧。 判断Cesium场景是否加载完毕这件事是非常有意义的。 加载…...

【数据结构】6道经典链表面试题

目录 1.返回倒数第K个节点【链接】 ​代码实现 2.链表的回文结构【链接】 代码实现 3.相交链表【链接】 代码实现 4.判断链表中是否有环【链接】 代码实现 常见问题解析 5.寻找环的入口点【链接】 代码实现1 ​代码实现2 6.随机链表的复制【链接】 代码实现 1.…...

等保测评1.0到2.0的演变发展

中国等保测评的演变 作为中国强化网络安全监管制度的重要组成部分&#xff0c;信息安全等级保护测评不是一个新概念&#xff0c;可以追溯到1994年和2007年发布的多项管理规则&#xff08;通常称为等保测评 1.0规则&#xff09;&#xff0c;根据这些规则&#xff0c;网络运营商…...

yum 源配置

在/etc/yum.repo.d目录下 格式&#xff1a; [repository_name] nameRepository description baseurlhttp://repository_url enabled1 gpgcheck0 gpgkeyfile:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7 其中&#xff1a; [repository_name]&#xff1a;源的标识名称&#xff0c;…...

别再死记硬背了!用这5个真实项目案例,彻底搞懂Python函数参数与返回值

别再死记硬背了&#xff01;用这5个真实项目案例&#xff0c;彻底搞懂Python函数参数与返回值 函数是Python编程的基石&#xff0c;但很多初学者在学完基础语法后&#xff0c;面对实际项目依然无从下手。本文将通过5个真实开发场景&#xff0c;带你从"会用"到"懂…...

Unity游戏接入TapTap登录,从后台配置到打包上线的完整避坑指南

Unity游戏接入TapTap登录的全流程避坑指南&#xff1a;从配置到上线的实战经验 在独立游戏开发领域&#xff0c;TapTap平台凭借其庞大的用户基础和便捷的登录系统&#xff0c;已成为许多开发者的首选接入方案。然而&#xff0c;从后台配置到最终打包上线的完整流程中&#xff0…...

多维子集和问题:NP难问题的算法与应用解析

1. 多维子集和问题概述多维子集和问题(Multi-dimensional Subset Sum Problem)是计算复杂度理论中的经典NP难问题。简单来说&#xff0c;它要求在给定的n维向量集合中&#xff0c;找出一个子集&#xff0c;使得该子集中所有向量在每一维上的和恰好等于目标向量对应的分量。这个…...

MCP服务器开发指南:为AI助手构建安全可控的外部工具扩展

1. 项目概述&#xff1a;一个为AI助手赋能的MCP服务器最近在折腾AI应用开发的朋友&#xff0c;可能都绕不开一个词&#xff1a;MCP。全称是Model Context Protocol&#xff0c;你可以把它理解成一套标准化的“插件协议”。它让像Claude、Cursor这类AI助手&#xff0c;能够安全、…...

揭秘Midjourney“树胶重铬酸盐”风格指令:3步精准触发古典印相质感,92%用户从未用对的隐藏参数组合

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;树胶重铬酸盐工艺的光学原理与数字映射本质 树胶重铬酸盐&#xff08;Gum Bichromate&#xff09;工艺是19世纪末发展起来的经典光敏印相技术&#xff0c;其核心光学原理基于重铬酸盐在紫外光照射下发生…...

CFD工程师必看:TVD格式选型指南——从SUPERBEE到UMIST,哪个才是你的菜?

CFD工程师必看&#xff1a;TVD格式选型实战指南——从工程场景到最优解 在计算流体力学(CFD)的世界里&#xff0c;TVD格式就像赛车手的轮胎选择——没有绝对的好坏&#xff0c;只有场景的适配。当你在汽车外气动分析中遇到激波振荡&#xff0c;或在燃烧模拟中面临虚假扩散时&am…...

Noto Emoji:专业解决跨平台表情符号渲染难题的终极方案

Noto Emoji&#xff1a;专业解决跨平台表情符号渲染难题的终极方案 【免费下载链接】noto-emoji Noto Emoji fonts 项目地址: https://gitcode.com/gh_mirrors/no/noto-emoji 在现代数字通信中&#xff0c;表情符号已成为不可或缺的语言元素&#xff0c;然而跨平台表情符…...

终极指南:5分钟掌握League Akari英雄联盟工具箱的强大功能

终极指南&#xff1a;5分钟掌握League Akari英雄联盟工具箱的强大功能 【免费下载链接】League-Toolkit An all-in-one toolkit for LeagueClient. Gathering power &#x1f680;. 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit League Akari是一款基于…...

基于WebSocket的机械爪远程控制桥接系统设计与实战

1. 项目概述&#xff1a;一个连接物理世界与数字世界的“机械爪”远程控制桥最近在捣鼓一个挺有意思的开源项目&#xff0c;叫lucas-jo/openclaw-bridge-remote。光看名字&#xff0c;你可能觉得这又是一个关于机器人或者机械臂的遥控项目&#xff0c;但实际深入进去&#xff0…...

【ElevenLabs匈牙利语音实战指南】:2024最新API调用、音色微调与本地化合规避坑全解析

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;ElevenLabs匈牙利语音支持概览与本地化价值定位 ElevenLabs 自 2024 年 3 月起正式引入匈牙利语&#xff08;hu-HU&#xff09;语音合成支持&#xff0c;成为其首批覆盖的中东欧语言之一。该能力依托于…...