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\)为链表中节点的数目。需要将链表中的每个节点都保存在哈希表当中。

posted @ 2021-06-27 23:27  chenzufeng  阅读(64)  评论(0编辑  收藏  举报