142. 环形链表 II
142. 环形链表 II
给定一个链表,返回链表开始入环的第一个节点
。 如果链表无环,则返回null
。
为了表示给定链表中的环,使用整数position
来表示链表尾连接到链表中的位置(索引从\(0\)开始)。 如果position
是\(-1\),则在该链表中没有环。注意,position
仅仅是用于标识环的情况,并不会作为参数传递到函数中。
说明:不允许修改给定的链表。
示例:
输入:head = [3, 2, 0, -4], pos = 1
输出:返回索引为 1 的链表节点
解释:链表中有一个环,其尾部连接到第二个节点。
解题思路
方法一:哈希表
使用哈希表遍历链表中的每个节点,并将它记录下来。一旦遇到了此前遍历过的节点,就可以判定链表中存在环,并且可以立即返回链表入环位置。
代码实现
import java.util.HashSet;
import java.util.Set;
/**
* 142. 环形链表 II
* 寻找链表的入环位置
* @author chenzufeng
* @date 2021-06-27
*/
public class No142_LinkedListCycle2 {
public SinglyLinkedListNode detectCyclePosition(SinglyLinkedListNode head) {
// position为链表的入环位置
SinglyLinkedListNode position = head;
Set<SinglyLinkedListNode> visitedPosition = new HashSet<>();
while (position != null) {
if (visitedPosition.contains(position)) {
return position;
} else {
visitedPosition.add(position);
}
position = position.nextNode;
}
// 链表没有环
return null;
}
}
复杂度分析
-
时间复杂度:\(O(N)\),其中\(N\)为链表中节点的数目。恰好需要访问链表中的每一个节点。
-
空间复杂度:\(O(N)\),其中\(N\)为链表中节点的数目。需要将链表中的每个节点都保存在哈希表当中。