解题思路:
第一种做法:维护一个map
第二种做法:双指针(做法来自题目后面讨论区)

提交代码:维护map
class Solution {
public ListNode detectCycle(ListNode head) {
if(head==null||head.next==null) return null;
Map<ListNode,Boolean> map=new HashMap<>();
ListNode p=head;
while(p!=null) {
if(map.containsKey(p)) return p;
map.put(p, true);
p=p.next;
}
return null;
}
}
运行结果:

提交代码:双指针
class Solution{
public ListNode detectCycle(ListNode head) {
if(head==null||head.next==null) return null;
ListNode p1=head.next,p2=head.next.next;
while(p1!=p2) {
p1=p1.next;
if(p2!=null&&p2.next!=null&&p2.next.next!=null)
p2=p2.next.next;
else return null;
}
p1=head;
while(p1!=p2) {
p1=p1.next;
p2=p2.next;
}
return p1;
}
}
运行结果:

本文介绍两种有效的链表环检测方法:使用哈希表(map)和双指针技术。哈希表方法通过存储遍历过的节点来检测重复,而双指针(快慢指针)则在不额外使用空间的情况下找到环的入口点。
3230

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



