Algorithm/src/main/java/linkedlist/DetectCycle.java

54 lines
1.8 KiB
Java
Raw Normal View History

2025-03-18 09:09:22 +08:00
package linkedlist;
import java.util.HashSet;
/**
* 题目 142. 环形链表 II (detectCycle)
* 描述给定一个链表的头节点 head 返回链表开始入环的第一个节点 如果链表无环则返回 null
* 如果链表中有某个节点可以通过连续跟踪 next 指针再次到达则链表中存在环 为了表示给定链表中的环评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置索引从 0 开始如果 pos -1则在该链表中没有环注意pos 不作为参数进行传递仅仅是为了标识链表的实际情况
* 不允许修改 链表
* 链接https://leetcode.cn/problems/linked-list-cycle-ii/
*/
public class DetectCycle {
//哈希
public ListNode detectCycle1(ListNode head) {
ListNode pos = head;
HashSet<ListNode> visited = new HashSet<ListNode>();
while (pos != null) {
if (visited.contains(pos)) {
return pos;
} else {
visited.add(pos);
}
pos = pos.next;
}
return null;
}
//Floyd 快慢指针
public ListNode detectCycle(ListNode head) {
if (head == 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 ptr = head;
while (ptr != slow) {
ptr = ptr.next;
slow = slow.next;
}
return ptr;
}
}
return null;
}
}