题目:
解决方法:快慢指针、哈希
1.快慢指针
存在假设,当快慢指针相遇时,快指针走的步数是慢指针的2倍,则有,2(a+b)=a+b+c+b,得出a=c,所以相遇时,一个从头节点向前走,一个从相遇节点继续走,再次相遇就是入口。
感谢牛客题解
public class Solution {
public ListNode detectCycle(ListNode head) {
ListNode slow = head;
ListNode fast = head;
while(fast!=null&&fast.next!=null){
slow = slow.next;
fast = fast.next.next;
if(slow==fast)
break;
}
if(fast==null||fast.next==null)
return null;
slow = head;
while(slow!=fast){
slow = slow.next;
fast = fast.next;
}
return slow;
}
}
时间复杂度:O(n)
空间复杂度:O(1)
2.哈希
存入set的第一个重复的节点就是入口节点
public class Solution {
public ListNode detectCycle(ListNode head) {
HashSet<ListNode> set = new HashSet<>();
ListNode node = head;
while(node!=null){
if(!set.contains(node))
{
set.add(node);
node = node.next;
}
else
break;
}
return node;
}
时间复杂度:O(n)
空间复杂度:O(n)