题目描述
给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。
解题思路
- 设置快慢指针,当两个指针相遇时,这个所指向的节点一定在环中,如果环不存在,则快慢指针不会相遇。快指针是慢指针的两倍快;
- 从上一步中的节点出发,再走一遍,知道回到这个节点,所走过的节点数量是环的长度;
- 使快慢指针指向头节点,其中一个指针先走环的长度,另一个指针开始走,当两个指针指向同样的节点时,该节点就是环的入口节点。
代码
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}
*/
public class Solution {
public ListNode EntryNodeOfLoop(ListNode pHead)
{
if(pHead == null) return null;
ListNode preHead = pHead;
ListNode root = pHead;
while(preHead != null){
if(preHead.next == null) return null;
preHead = preHead.next.next;
root = root.next;
if(preHead == root){
ListNode start = root;
int len = 1;
start = start.next;
while(start != root){
start = start.next;
len++;
}
preHead = pHead;
root = pHead;
while(len > 0){
preHead = preHead.next;
len--;
}
while(preHead != root){
preHead = preHead.next;
root = root.next;
}
return root;
}
}
return null;
}
}