给定一个链表,如果它是有环链表,实现一个算法返回环路的开头节点

如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。注意:**pos **不作为参数进行传递,仅仅是为了标识链表的实际情况。

23. 链表中环的入口结点 - 图1
输入:head = [3,2,0,-4], pos = 1
输出:tail connects to node index 1
解释:链表中有一个环,其尾部连接到第二个节点。

23. 链表中环的入口结点 - 图2
输入:head = [1,2], pos = 0
输出:tail connects to node index 0
解释:链表中有一个环,其尾部连接到第一个节点。

23. 链表中环的入口结点 - 图3
输入:head = [1], pos = -1
输出:no cycle
解释:链表中没有环。

进阶:你是否可以不用额外空间解决此题?

Set找重复

  1. const detectCycle = function (head) {
  2. const visited = new Set();
  3. while (head !== null) {
  4. if (visited.has(head)) {
  5. return head;
  6. }
  7. visited.add(head);
  8. head = head.next;
  9. }
  10. return null;
  11. };

快慢指针

完全没快多少,就是没用更多内存

var detectCycle = function (head) {
  if (head === null) {
    return null;
  }
  let slow = head, fast = head;
  while (fast !== null) {
    slow = slow.next;
    if (fast.next !== null) {
      fast = fast.next.next;
    } else {
      return null;
    }
    if (fast === slow) {
      let ptr = head;
      while (ptr !== slow) {
        ptr = ptr.next;
        slow = slow.next;
      }
      return ptr;
    }
  }
  return null;
};