当前位置: 首页 > 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;…...

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇&#xff0c;在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下&#xff1a; 【Note】&#xff1a;如果你已经完成安装等操作&#xff0c;可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作&#xff0c;重…...

生成xcframework

打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式&#xff0c;可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...

SciencePlots——绘制论文中的图片

文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了&#xff1a;一行…...

JavaScript 中的 ES|QL:利用 Apache Arrow 工具

作者&#xff1a;来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗&#xff1f;了解下一期 Elasticsearch Engineer 培训的时间吧&#xff01; Elasticsearch 拥有众多新功能&#xff0c;助你为自己…...

React Native在HarmonyOS 5.0阅读类应用开发中的实践

一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强&#xff0c;React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 &#xff08;1&#xff09;使用React Native…...

1.3 VSCode安装与环境配置

进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件&#xff0c;然后打开终端&#xff0c;进入下载文件夹&#xff0c;键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...

Qt Http Server模块功能及架构

Qt Http Server 是 Qt 6.0 中引入的一个新模块&#xff0c;它提供了一个轻量级的 HTTP 服务器实现&#xff0c;主要用于构建基于 HTTP 的应用程序和服务。 功能介绍&#xff1a; 主要功能 HTTP服务器功能&#xff1a; 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...

DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI

前一阵子在百度 AI 开发者大会上&#xff0c;看到基于小智 AI DIY 玩具的演示&#xff0c;感觉有点意思&#xff0c;想着自己也来试试。 如果只是想烧录现成的固件&#xff0c;乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外&#xff0c;还提供了基于网页版的 ESP LA…...

Linux云原生安全:零信任架构与机密计算

Linux云原生安全&#xff1a;零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言&#xff1a;云原生安全的范式革命 随着云原生技术的普及&#xff0c;安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测&#xff0c;到2025年&#xff0c;零信任架构将成为超…...

精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南

精益数据分析&#xff08;97/126&#xff09;&#xff1a;邮件营销与用户参与度的关键指标优化指南 在数字化营销时代&#xff0c;邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天&#xff0c;我们将深入解析邮件打开率、网站可用性、页面参与时…...