给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null
。
为了表示给定链表中的环,我们使用整数 pos
来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos
是 -1
,则在该链表中没有环。
说明:不允许修改给定的链表。
示例 1:
输入:head = [3,2,0,-4], pos = 1
输出:tail connects to node index 1
解释:链表中有一个环,其尾部连接到第二个节点。

示例 2:
输入:head = [1,2], pos = 0
输出:tail connects to node index 0
解释:链表中有一个环,其尾部连接到第一个节点。

示例 3:
输入:head = [1], pos = -1
输出:no cycle
解释:链表中没有环。

解题思路:
1,首先用快慢指针判断是否有环
2,假设快慢指针相遇的位置为环起点m后第p个位置,环剩余q个位置
则:
A,m+p=2*(m+p)-k*(p+q) k为整数,跟m长度与环大小比有关
B,假设k=1 则,m=q
C,m=k*(p+q)-p=(k-1)*(p+q)+q
3,由此可知,如果慢指针从相遇位置开始,新指针从头开始,则相遇位置一定为环起点
/*** Definition for singly-linked list.* type ListNode struct {* Val int* Next *ListNode* }*/func detectCycle(head *ListNode) *ListNode {fast:=headslow:=headflag:=falsefor fast!=nil && fast.Next!=nil{fast=fast.Next.Nextslow=slow.Nextif fast!=nil && slow==fast{flag=truebreak}}if !flag{return nil}fast=headfor fast!=slow{fast=fast.Nextslow=slow.Next}return fast}
文章转载自golang算法架构leetcode技术php,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




