剑指offer 55.链表中环的入口结点
题目
给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。
思路
现在成了数学题了,首先设快慢两点都在开头,快结点一下走两步,慢结点一下走一步,当快结点追上慢结点就代表存在环。
当二者相遇,快结点回到开头,慢结点继续走,当二者再次相遇时,结点就为环的入口结点。记得要考虑到没有下一个结点的可能性。
数学问题我就不证明了,画一个图就能理解了。
代码
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}
public ListNode EntryNodeOfLoop(ListNode pHead) {
ListNode fast = pHead;
ListNode slow = pHead;
while (fast != null && fast.next != null) {
fast = fast.next.next;
slow = slow.next;
if (fast == slow) {
break;
}
}
if (fast == null || fast.next == null) {
return null;
}
fast = pHead;
while (fast != slow) {
fast = fast.next;
slow = slow.next;
}
return fast;
}