- 方法
哈希表解决 - 算法思想
方法类似于第160题相交链表,本质上都是找到一个相同地址的结点,使用哈希表保存遍历过的结点,如果发现当前结点已经保存在哈希表中,则证明形成环并且当前结点为尾结点后的第一个结点。值得注意的是,一旦没有环,该循环也不会无限持续下去。 - 详细代码
/**
1. Definition for singly-linked list.
2. class ListNode {
3. int val;
4. ListNode next;
5. ListNode(int x) {
6. val = x;
7. next = null;
8. }
9. }
*/
public class Solution {
public ListNode detectCycle(ListNode head) {
HashSet<ListNode> set = new HashSet<ListNode>();
while(head != null){
if(set.contains(head)){
return head;
}
set.add(head);
head = head.next;
}
return null;
}
}
此外还有快慢指针方法,代码如下:
/**
* 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 fast = head;
ListNode slow = head;
ListNode fast1 = head;
while(fast != null){
slow = slow.next;
if(fast.next == null){
return null;
}else{
fast = fast.next.next;
}
if(fast == slow){
while(fast1 != slow){
fast1 = fast1.next;
slow = slow.next;
}
return fast1;
}
}
return null;
}
}