剑指offer第五十五题。

题目描述

给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。

解题思路

定理:两个指针一个fast、一个slow同时从一个链表的头部出发

fast一次走2步,slow一次走一步,如果该链表有环,两个指针必然在环内相遇

此时只需要把其中的一个指针重新指向链表头部,另一个不变(还在环内),

这次两个指针一次走一步,相遇的地方就是入口节点。

我的答案

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public ListNode EntryNodeOfLoop(ListNode pHead){

//空链表或者一个节点肯定没有环
if(pHead == null || pHead.next == null)
return null;
ListNode fast = pHead;
ListNode slow = pHead;

//fast一次跳两个节点,slow一次跳一个节点
//若有环,一定相遇,在环的某个节点停住
while(fast!=null && fast.next!=null){
fast = fast.next.next;
slow = slow.next;
if(fast == slow)
break;
}

//一个重新指向头,一个不动,相遇点就是入口节点
fast = pHead;
while(fast != slow){
fast = fast.next;
slow = slow.next;
}

return fast;
}