JAVA版解法
解法一:
使用hash表来完成。该解法借鉴的是力扣中的官方解法一。使用了哈希表的不可重复的特点,如果出现了相同的链表结点就说明出现了环。
public ListNode detectCycle(ListNode head) {
ListNode pos = head;
Set<ListNode> visited = new HashSet<ListNode>(); //<>里面是ListNode是链表的结点类型。
while (pos != null) {
if (visited.contains(pos)) {
return pos;
} else {
visited.add(pos);
}
pos = pos.next;
}
return null;
}
解法二:
双指针的方法:根据数学方法,我们可以知道,快指针从快慢指针相遇的结点出发,慢指针从头结点出发,每个指针每次向后移动一次,当两指针相遇的位置就是环的入口。具体的解法在代码随想录。
public class Solution {
public ListNode detectCycle(ListNode head) {
ListNode fast =head;
ListNode slow =head;
while(fast!= null &&fast.next !=null) {
fast =fast.next.next;
slow =slow.next;
if(fast ==slow) { //表示此时存在环路,只有存在环路的情况fast才会等于slow
ListNode index1 = fast; //在创建两个指针,分别指向快指针与头结点的指针
ListNode index2 = head;
while(index1 != index2){
index1 = index1.next;
index2 = index2.next;
}
return index2;
}
}
return null;
}
}