BM7 链表中环的入口结点

题目描述

image

思路分析

做这道题我第一反应是用“记事本”,也就是将遍历过的节点存储起来,如果下次再遍历到这个节点,那么也就是环的入口节点。遍历节点,如果是遍历过的,那么就直接返回这个节点,否则就将这个节点存起来。理解起来思路比较容易,做起来也比较快。

后来在参考别人的代码时发现它们用的数学方法,我也不太懂,思路大概如下:
image

代码参考

// 方法一,使用哈希表对对遍历过的链表节点进行保存,
// 如果之前已经遍历过,那么就将它的值设置为true,
// 后续在进行判断时先进行判断,如果为true则直接返回,也就是之前访问过该节点了

const EntryNodeOfLoop = function (head) {
  if (!head || !head.next) return null
  let p = head
  // 使用map进行存储
  const map = new Map()
  while (p) {
    if (map.get(p)) return p
    else {
      map.set(p, true)
    }
    p = p.next
  }
}
// 方法二:(数学方法)
/*
  使用快慢指针的方法
*/
function EntryNodeOfLoop2 (pHead) {
  // 判断条件
  if (!pHead || !pHead.next) return null
  // 设置快慢指针
  let fast = slow = pHead
  while (fast && fast.next) {
    slow = slow.next
    fast = fast.next.next
    if (slow == fast) {
      let ptr = pHead
      while (ptr != slow) {
        ptr = ptr.next
        slow = slow.next
      }
      return ptr
    }
  }
}
posted @ 2022-12-30 22:14  含若飞  阅读(29)  评论(0编辑  收藏  举报