哈希表
/**
* Definition for singly-linked list.
* class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
public class Solution {
public ListNode detectCycle(ListNode head) {
Set<ListNode> storeSet = new HashSet<ListNode>();
ListNode p=head;
int pos=-1;
while(p!=null){
if(!storeSet.add(p)){
break;
}
++pos;
p=p.next;
}
if(pos==-1){
return null;
}
for(int i=0;i<=pos;i++){
head=head.next;
}
return head;
}
}
快慢指针:
首先让快指针每次走两个节点,满指针每次走一个节点,快慢指针相遇则存在环。
然后,令慢指针回到head,快慢指针均走一个节点,相遇即为入环的第一个节点。
(解析说可以用数学公式证明,咱数学一般,反正是有点一知半解,只能说是有点秒)
/**
* Definition for singly-linked list.
* class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
public class Solution {
public ListNode detectCycle(ListNode head) {
if(head==null){
return null;
}
ListNode slowPtr=head,fastPtr=head;
boolean isExit = false;
while(fastPtr.next!=null&&fastPtr.next.next!=null){
slowPtr=slowPtr.next;
fastPtr=fastPtr.next.next;
if(slowPtr==fastPtr){
isExit=true;
break;
}
}
if(isExit){
slowPtr=head;
while(slowPtr!=fastPtr){
slowPtr=slowPtr.next;
fastPtr=fastPtr.next;
}
return slowPtr;
}
return null;
}
}