[LeetCode]142. 环形链表 II(java实现)快慢指针+finder指针
1. 题目
2. 读题(需要重点注意的东西)
思路(快慢指针+finder指针):
要求使用O(1)
的空间复杂度,并且不能修改链表
从[LeetCode]141. 环形链表(java实现)快慢指针判断环我们知道,快慢指针会在环内相遇,那么如何找到环的入口呢?
在这里需要定义第三个指针helper
。当快慢指针在环内相遇时,helper指针从链表头开始和slow指针一起走,当helper指针和slow指针相遇时,即为环的入口。
具体证明请看Java常见算法—弗洛伊德算法(环的相关判断)。
3. 解法
---------------------------------------------------解法---------------------------------------------------:
/**
* Definition for singly-linked list.
* class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
public class Solution {
public ListNode detectCycle(ListNode head) {
ListNode fast = head;
ListNode slow = head;
ListNode helper = head;
if(head == null || head.next == null) return null;
while(fast.next != null && fast.next.next != null){
fast = fast.next.next;
slow = slow.next;
if(fast == slow){
while(helper != slow){
helper = helper.next;
slow = slow.next;
}
return slow;
}
}
return null;
}
}
可能存在的问题: