题目:

解决方法:快慢指针、哈希
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)
本文探讨了两种高效算法来检测链表中的循环:快慢指针法通过相遇节点再次相遇找到入口,时间复杂度为O(n);哈希法利用集合检查重复节点,空间复杂度O(n)。两种方法适用于解决链表循环问题。
3496

被折叠的 条评论
为什么被折叠?



