题目描述
一个链表中包含环,请找出该链表的环的入口结点。
编程思路
定义两个指针slow和fast,第一次走,slow和fast都从头结点开始,slow每次走一步,fast每次走两步,当slow和fast相遇时,fast比slow多走 的步数就是环中的结点数。第二次走,slow还是从头结点开始,而fast从第一次slow和fast相遇的结点开始,直到slow和fast再次相遇时,这次相遇的结点就是该链表的环的入口结点。
程序代码
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 slow = pHead;
ListNode fast = pHead;
do {
if(fast.next == null)
return null;
slow = slow.next;
fast = fast.next;
if(fast.next == null)
return null;
fast = fast.next;
} while(slow != fast);
slow = pHead;
while(slow != fast) {
slow = slow.next;
fast = fast.next;
}
return slow;
}
}