3. 环形链表Ⅱ
难度级别:中等
题目类型:链表
题目描述
![](https://img-blog.csdnimg.cn/img_convert/6075ac41d68cdf5d356a849faab65881.png)
解题思路:
哈希表法:
使用哈希表,如果哈希表中没有含有链表结点,则将其加入哈希表中,指针往下移,如果此时该指针为空,则说明不存在环。返回结果null。否则继续遍历,直到哈希表中出现一个结点与指针所指结点相同,退出循环,返回该节点。
时间复杂度:O(n)
空间复杂度:O(n)
源代码
/**
* 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 || head.next == null)
return null;
Set<ListNode> cycle = new HashSet<ListNode>();
while(!cycle.contains(head))
{
cycle.add(head);
head = head.next;
if(head == null)
return null;
}
return head;
/* //快慢指针法
if(head == null || head.next == null)
return null;
ListNode slow = head, fast = head;
while(fast != null)
{
slow = slow.next;
if(fast.next != null)
fast = fast.next.next;
else
return null;
if(fast == slow)
{
ListNode result = head;
while(result != slow)
{
result = result.next;
if(slow != null)
slow = slow.next;
else
return null;
}
return result;
}
}
return null;
*/
}
}