题目
给定一个链表,判断一个链表中是否存在环,若存在,求入环点
思路:
设置快慢指针来判断是否存在环,具体为快慢指针刚开始都指在头节点,快指针一次移动两个节点,慢指针一次移动一个节点,若两个指针指向同一节点,则证明链表中存在环,入环点的求法见下图:
数学方法可证得F=b,而h点为快慢指针相遇点,所以,当两个指针相遇时,让快指针指向初始位置且快指针也每次移动一个节点,慢指针继续走,当两者再次相遇的时候,就是入环点。
代码:
public class WasAnnular {
public static ListNode detectCycle(ListNode head) {
ListNode slow = head;
ListNode fast = head;
while(fast!=null) {
fast = fast.next.next;
slow = slow.next;
if(fast ==slow) {
fast = head;
while(true) {
if (slow == fast) {
return slow;
}
slow = slow.next;
fast = fast.next;
}
}
}
return null;
}
public static void main(String[] args) {
ListNode l1 = new ListNode(0);
ListNode l2 = new ListNode(-1);
ListNode l3 = new ListNode(5);
ListNode l4 = new ListNode(3);
l1.next = l2;
l2.next = l3;
l3.next = l4;
l4.next = l2;
System.out.println(detectCycle(l1));
}
}