【路飞】链表-环形链表

193 阅读1分钟

「这是我参与11月更文挑战的第7天,活动详情查看:2021最后一次更文挑战

题目:141. 环形链表

image.png

分析

如果不含有环,跑得快的那个指针最终会遇到null,说明链表没有环;如果含有环,快指针最终会超慢指针1圈,和慢指针相遇,说明链表有环。

function hasCycle(head) {
    let fast = head;
    let slow = head;
    while(fast && fast.next) {
      fast = fast.next.next;
      slow = slow.next;
      if(fast == slow) {
        return true;
      }
    }
    return false;
};

题目:142. 环形链表 II

image.png

分析

设相遇点于环的起点的距离为m,那么环的起点与头节点head的距离为k-m,也就是说从head前进k-m步就能到达环起点;巧的是,如果从相遇点继续前进k-m步,也恰好到达环起点;

function detectCycle(head) {
    let fast = head;
    let slow = head;
    while(fast && fast.next) {
        fast = fast.next.next;
        slow = slow.next;
        if(fast == slow) break;
    }
    // 上面的代码和判断是否有环相识
    if(!fast || !fast.next) {
      return null
    }
    fast = head;
    while(fast != slow) {
      // 两个指针以相同的速度前进
      fast = fast.next;
      slow = slow.next;
    }
    // 两个指针相遇的那个单链表节点就是环的起点
    return fast;
}