142链表-环形链表
Posted 孤注一掷 、
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了142链表-环形链表相关的知识,希望对你有一定的参考价值。
题目
链接:142. 环形链表 II - 力扣(LeetCode)
思路
首先判断链表是否有环:
使用快慢指针法,分别定义fast和slow,从头结点出发,fast每次移动两个节点,slow每次移动一个节点,如果fast和slow在中途相遇,说明链表有环。
如果有环如何找到这个环的入口:
如图,相遇时slow走过的为:x+y,fast走过的为:x+y+n(y+z)
则(x+y)*2 = x+y+n(y+z),整理为:x = (n-1)(y+z)+z
即n为1时,x=z
n大于1时效果是一样的,只不过多转了几圈
代码
public class Solution
public ListNode detectCycle(ListNode head)
ListNode slow = head;
ListNode fast = head;
while (fast != null && fast.next != null)
slow = slow.next;
fast = fast.next.next;
if(slow == fast)//有环
ListNode index1 = fast;
ListNode index2 = head;
//两个指针,从头结点和相遇结点,各走一步,直到相遇,相遇点即为环入口
while(index1 != index2)
index1 = index1.next;
index2 = index2.next;
return index1;
return null;
以上是关于142链表-环形链表的主要内容,如果未能解决你的问题,请参考以下文章
LeetCode 142. 环形链表 II(逻辑环链表快慢双指针)