题意:如果存在环,要么是个圆环,要么是个6字型的环
有想到快慢指针,但是没有做对
思路一:哈希表,既然存在环,那么必定经过同一节点,我们把每一个走过的节点都加进去,碰到重复节点则返回
import java.util.Set;
import java.util.HashSet;
public class Solution {
public ListNode EntryNodeOfLoop(ListNode pHead) {
if(pHead==null || pHead.next==null)
{
return null;
}
Set<ListNode> set=new HashSet<>();
while(pHead!=null)
{
if(!set.add(pHead))
{
return pHead;
}
else
set.add(pHead);
pHead=pHead.next;
}
return null;
}
}
时间 O(N)
空间 O(N)
思路二:快慢指针()
参考牛客官方
代码实现:
public class Solution {
public ListNode EntryNodeOfLoop(ListNode pHead) {
//无节点、单个节点不存在环
if(pHead==null || pHead.next==null)
return null;
ListNode fast=pHead;
ListNode slow=pHead;
while(fast!=null && fast.next!=null)
{
fast=fast.next.next;
slow=slow.next;
if(fast==slow)
break;
}
//链表多个节点,不存在环
if(fast==null)
return null;
else
{
fast=pHead;
while(fast!=slow)
{
fast=fast.next;
slow=slow.next;
}
}
return fast;
}
}
时间O(N)
空间O(1)