一.方法一
思路:使用Java中的ArrayList的数组,创建一个p指针指向head,然后逐步往后遍历,查看数组中包不包含p,如果包含,返回p,不包含,将p加入到数组中,p=p.next;
代码:
public class Solution {
public ListNode detectCycle(ListNode head) {
List<ListNode> l=new ArrayList<>();
ListNode p=head;
if(head==null){
return null;
}
while(p!=null){
if(l.contains(p)){
return p;
}
else{
l.add(p);
p=p.next;
}
}
return null;
}
}
二.方法二
思路:使用快慢指针fast和slow,快指针一次走两步,慢指针一次走一步,当快慢指针相等的时候,设一个指针ss指向head,ss和slow同时向后遍历,当ss=slow的时候,返回ss。
public class Solution {
public ListNode detectCycle(ListNode head) {
ListNode fast=head;
ListNode slow=head;
if(head==null||head.next==null){
return null;
}
while(fast!=null&&fast.next!=null){
slow=slow.next;
fast=fast.next.next;
if(fast==slow){
ListNode ss= head;
while(ss!=slow){
ss=ss.next;
slow=slow.next;
}
return ss;
}
}
return null;
}
}