力扣题目:环形链表
哈希表:
/**
* 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> visited = new HashSet<ListNode>();
ListNode tmp = head;
// 非环则遍历到尾节点
while (tmp != null) {
// 哈希表包含则返回该节点
if (visited.contains(tmp)) {
return tmp;
} else {
visited.add(tmp);
}
tmp = tmp.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) {
ListNode slow = head;
ListNode quick = head;
while (quick != null) {
// 移动快慢指针直至交汇点
quick = quick.next;
if (quick != null) {
quick = quick.next;
}
slow = slow.next;
// 同时移动头指针和交汇指针直至两者相交即为入口节点
if (slow == quick && slow != null) {
ListNode tmp = head;
while (tmp != quick) {
tmp = tmp.next;
quick = quick.next;
}
return tmp;
}
}
return null;
}
}