【数据结构】-- 相交链表-环形链表

交叉链表

. - 力扣(LeetCode) 
如果链表的两条链的长度一样,链表两端对齐,解决这个问题将会变得非常简单,直接分别遍历两个链表,想等时的节点即为所求。我们想办法让链表对齐--分别从a和b遍历链表,分别求出以a开始和以b开始时的链表长度,求出a,b之差的绝对值k。然后再让较长一端先走k步,这样就对齐了。然后再同时遍历链表,两端相等时,这个节点即为所求。
其实,这就是一个快慢指针的解法,快慢指针每次都只走一步,只不过快指针先走使链表对齐。

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*/typedef struct ListNode ListNode;
struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {ListNode* a = headA;ListNode* b = headB;int count1 = 0;int count2 = 0;while(a->next){a = a->next;count1++;} while(b->next){b = b->next;count2++;}if (a != b){return NULL;}a = headA;b = headB;int k = abs(count1 - count2);ListNode* LongA = a;ListNode* shortB = b;if(count2 > count1){LongA = b;shortB = a;}while(k--){LongA = LongA->next;}while(shortB && LongA){LongA = LongA->next;shortB = shortB->next;if (shortB == LongA)return shortB;}}

环形链表

环形链表 一

 . - 力扣(LeetCode)

如果只用一个指针遍历链表,会在环中死循环。在这到题中我们还是使用快慢指针的解法:定义fast和slow两个指针,fast每次走两步,slow每次走一步。如果没有环,fast会先走到尾节点。如果有环,fast会比slow先到环中,到slow走到环中时便成了追击相遇问题,fast比slow快,总会追到slow,如果fast == slow,就说明链表中有环。

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*/typedef struct ListNode ListNode;
bool hasCycle(struct ListNode *head) {ListNode* slow = head;ListNode* fast = head; while(fast && fast->next){fast = fast->next->next;slow = slow->next;if (fast == slow){return true;}}return false;
}

延申讨论 

当fast一次走三步,slow一次走一步的时候还能相遇吗?会不会错过?

设非环部分的长度为L,环的长度为C,fast距slow为N。

当slow进环后每走一步,相差的距离减少2

依次为 N

          N - 2

          N - 4 

           .........

如果N是偶数,那么就可以相遇。如果N为奇数,fast与slow的距离变为C - 1,进入下一次循环,若C - 1为偶数,fast 与slow之间的距离一次依次减少2,最后为0,相遇。若C - 1是奇数,那么fast与slow的距离依次减少2,最后fast与slow又会错过,距离又变为C - 1,依次重复,永远遇不到。

这样算出来,将永远遇不到,但是这样要满足一个条件,N是奇数,C - 1为奇数。我们还有一个条件没有用到fast移动的距离是slow的3倍,以此可得:

                

 2 * L必为偶数,那么若C - 1为奇数,C就为偶数,N必为偶数,所以不相遇的条件不存在。

fast与slow必会相遇。

这种数理上的题就是为了筛选出的,为了考核。虽然可能没什么应用的意义,但是考查了数理能力,在面试的时候解出来会让面试官眼前一亮。

环形链表 二

. - 力扣(LeetCode)

 定义fast和slow两个指针,slow每次走一步,fast每次走两步。设环长为C,非环部分长为L,当slow与fast相遇的时候,slow又走的距离为N。

就和高中的物理题一样,我们要找等式关系。设fast所走的总路程为F,slow的为S,当slow与fast相遇时:

F = L +  N + x * C   (假设fast在环中已经走了x圈)
S = L +  N

F是S的2倍。L + N + x * C = 2( L + N )
化简为:       L = x *C - N  = ( x - 1 ) *  C  + C - N

重新定义一个节点cmp从头开始一步一步走,设slow和fast相交的点为meet,同时开始一步一步走。所以cmp走了( x - 1 ) * C 过后还剩 C - N;meet走了(x - 1)* C回到原点到原点。这时,cmp和meet都相距环的起点C - N。当它们相遇时,这个节点即为所求

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*/typedef struct ListNode ListNode;
struct ListNode *detectCycle(struct ListNode *head) {ListNode* slow = head;ListNode* fast = head; while(fast && fast->next){fast = fast->next->next;slow = slow->next;if (fast == slow){ListNode * new = head;while(slow != new){slow = slow->next;new = new->next;}return new;}}return NULL;
}

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

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

相关文章

Mysql与Java连接----JDBC

前言: 当将Java与MySQL数据库连接时,JDBC(Java Database Connectivity)是一种重要的技术。JDBC允许Java应用程序通过标准的数据库访问方式与不同的关系型数据库进行通信,其中包括MySQL。通过使用JDBC,Java开发人员可以…

二叉树的前序、中序、后序遍历

二叉树的前序、中序、后序 1.二叉树的前序遍历 题目: 二叉树的前序遍历 给你二叉树的根节点 root ,返回它节点值的 前序 遍历。 示例 1: 输入:root [1,null,2,3] 输出:[1,2,3]示例 2: 输入&#xff…

aigc的基础知识介绍

AIGC,即人工智能生成内容(Artificial Intelligence Generated Content),是一种利用人工智能技术自动生成各种形式内容的技术。以下是关于AIGC的基础知识介绍: 定义:AIGC指的是利用人工智能技术和算法来自动生成各种形式的内容,如文本、图像、音频和视频等。 发展历程:A…

LeetCode题练习与总结:不同的二叉搜索树Ⅱ--95

一、题目描述 给你一个整数 n ,请你生成并返回所有由 n 个节点组成且节点值从 1 到 n 互不相同的不同 二叉搜索树 。可以按 任意顺序 返回答案。 示例 1: 输入:n 3 输出:[[1,null,2,null,3],[1,null,3,2],[2,1,3],[3,1,null,nul…

Unity自定义动画-Animation动画数据-How is “fileIDToRecycleName“ generated

一般美术和程序分工明确的项目 fbx确实是和动画一一对应的; 但一些独立,或者小工作室的项目,就没法保证了,关键还是在于 Unity的 .meta 目录 查找和对比了一下 .fbx 和 .meta: 缓存和不缓存Animation 具体的Animat…

HCIP-Datacom-ARST自选题库_03_VLAN【26道题】

一、单选题 1.QinQ技术是一项扩展VLAN空间的技术,通过在802.1Q标签报文的基础上再增加一层802.1Q的Tag来达到扩展VLAN空间的功能。下列关于QinQ说法错误的是 灵活QinQ可以根据不同的内层Tag而加上不同的外层Tag,对于用户VLAN的划分更加细致 QinQ使VLA…

Golang | Leetcode Golang题解之第86题分隔链表

题目&#xff1a; 题解&#xff1a; func partition(head *ListNode, x int) *ListNode {small : &ListNode{}smallHead : smalllarge : &ListNode{}largeHead : largefor head ! nil {if head.Val < x {small.Next headsmall small.Next} else {large.Next hea…

栈的详尽技术分析

栈的详尽技术分析 一、引言 在计算机科学的领域中&#xff0c;数据结构是组织和管理数据的方式&#xff0c;对于编写高效算法而言至关重要。栈作为一种特殊的数据结构&#xff0c;其应用广泛&#xff0c;对理解程序语言的编译、内存管理以及算法设计等方面都有重要意义。 二、栈…

ue引擎游戏开发笔记(39)——npc的ai设定:追踪玩家以及瞄准

1.需求分析&#xff1a; 实现对npc的击杀和死亡反馈后&#xff0c;下一步需要赋予npc基本的ai&#xff0c;首先就是敌人要能够追踪或者说跟随玩家&#xff0c;这才能为后续npc开枪&#xff0c;对射做好准备&#xff0c;首先实现追踪玩家。 2.操作实现&#xff1a; 1.思路&…

代码随想录第六天打卡|242.有效的字母异位词,349. 两个数组的交集,202. 快乐数

242.有效的字母异位词 Python from collections import Counter class Solution:def isAnagram(self, s: str, t: str) -> bool:nCounter(s)mCounter(t)return nm C class Solution { public:bool isAnagram(string s, string t) {int Map[26]{0};for (int i0;i<s.s…

数据结构填空题专项.docx

1. 根据数据元素间关系的不同特性&#xff0c;通常可分为集合、线性 、树形 、图状 四 类基本结构。 2. 算法的 5 个特征包括&#xff1a; 有穷性、确定性 、有效性、输入和输出。 3. 数据结构中的数据元素存在“一对多”的关系称为 树形 结构。 4. 在包含 n 个元素的…

2024.5组队学习——MetaGPT智能体理论与实战(待续)

学习资料&#xff1a;项目地址——hugging-multi-agent、在线阅读、MetaGPT项目、MetaGPT中文文档 文章目录 一、环境配置1.1 配置MetaGPT1.2 配置大模型api_key1.3 测试demo 一、环境配置 全部工作在Autodl上完成&#xff0c;下面是简单记录&#xff1a; 1.1 配置MetaGPT 下…

不好!有敌情,遭到XSS攻击【网络安全篇】

XSS&#xff1a;当一个目标的站点&#xff0c;被我们用户去访问&#xff0c;在渲染HTMl的过程中&#xff0c;出现了没有预期到的脚本指令&#xff0c;然后就会执行攻击者用各种方法注入并执行的恶意脚本&#xff0c;这个时候就会产生XSS。 涉及方&#xff1a; 用户&#xff0…

前端铺子-uniapp移动端:跨平台开发新篇章

一、引言 在移动应用开发领域&#xff0c;随着技术的不断进步&#xff0c;用户对应用的需求也日益多样化。如何快速、高效地开发跨平台应用成为了前端开发者面临的一大挑战。uni-app作为一款使用Vue.js开发所有前端应用的框架&#xff0c;凭借其一次编写、多端运行的特性&…

Vue Excel 文件流导出乱码快速解决方案

今日在开发一个导出功能&#xff0c;原本一个非常简单的功能&#xff0c;却没想里面藏了陷阱&#xff01; 背景 前端导出的文件流乱码&#xff0c;此时确定非后端问题&#xff08;可以在postman导出是否正常来判断&#xff09;。 前端导出&#xff1a; 后端正常数据&#xf…

Nature 综述(IF=88):微生物群落和土壤性质之间的相互作用

随着社会的发展&#xff0c;环境污染和自然资源的消耗日益严重&#xff0c;土壤生态系统的健康状况备受关注。然而&#xff0c;当前研究领域存在一个问题&#xff0c;即在研究土壤微生物群落结构的同时&#xff0c;忽略了微生物对土壤环境的影响。本文旨在探讨微生物如何通过生…

『大模型笔记』MIT 最新的科尔莫戈洛夫-阿诺德网络(Kolmogorov-Arnold Network,KAN)简介

MIT 最新的科尔莫戈洛夫-阿诺德网络(Kolmogorov-Arnold Network,KAN)简介 文章目录 一. 探索 AI 下一前沿:科尔莫戈洛夫-阿诺德网络(KAN)1.1 基础回顾:多层感知器(MLPs)1.2 引入科尔莫戈洛夫-阿诺德网络(KAN)1.3 神经网络架构的开创性变革四. 参考文献内容出自:htt…

submitUpload() { this.$refs.upload.submit(); },

submitUpload() {this.$refs.upload.submit();}, submitUpload() 是一个函数&#xff0c;调用该函数会将 Vue 组件中的上传组件中的文件上传到服务器上。这个函数通过 this.$refs.upload.submit() 来实现&#xff0c;其中 this.$refs.upload 可以获取到上传组件的 DOM 对象&am…

js怎么判断视频链接是否能播放

标题js怎么判断视频链接是否能播放 这个函数用提供的URL创建一个新的Video元素&#xff0c;并根据视频是否可以播放来解析一个Promise。它监听canplaythrough事件来确定视频是否可播放&#xff0c;并监听error事件来处理可能发生的任何错误。 function canPlayVideo(url) {re…

【树】简要理解树的概念

P. S.&#xff1a;以下代码均在VS2019环境下测试&#xff0c;不代表所有编译器均可通过。 P. S.&#xff1a;测试代码均未展示头文件stdio.h的声明&#xff0c;使用时请自行添加。 目录 1、树的概念2、树的相关概念3、结语 1、树的概念 树是一种非线性的数据结构&#xff0c;它…