SWE · Onsite Coding

Airbnb 两条可能带环链表是否相交:环入口分类与节点身份

Onsite coding 问两条可能带环的单链表是否共享节点;用 Floyd 入环检测分类无环、一环、双环同入口/异入口。

题目重点:Onsite coding 问两条可能带环的单链表是否共享节点;用 Floyd 入环检测分类无环、一环、双环同入口/异入口。

题意与假设

这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。

  • 两条是由 next 指针构成的单链表,以对象身份判断共享节点,值相同不代表交点。
  • 返回布尔值;若要求交点节点,双环且环入口不同可能没有唯一‘第一个’交点,需另定义。

解题路线

  1. 对两条头指针分别用 Floyd 快慢指针检测环,若有环再定位各自入口 e1/e2。
  2. 两条均无环:比较尾节点身份,或用长度对齐后同速走找交点;布尔问题尾相同即相交。
  3. 恰一条有环:不可能相交,因为共享节点之后的 next 轨迹唯一,若相交则两条都最终入环。
  4. 两条都有环且 e1==e2:共享同一环,必相交;也可在入环前长度对齐寻找更早交点。
  5. 两条都有环但入口不同:从 e1 沿环走一圈,若经过 e2 则共享同一环、相交,否则环不同、不相交。
  6. 整体判断只读 next、不改链表,处理空头、单节点自环、长前缀与两个入口不同的共享环。

手动走一遍

训练例:A 走 p→c1→c2→c1,B 走 q→c2→c1→c2;A/B 环入口不同但处于同一环,因此相交。另两条都含值 7 但节点对象不同则不相交。

规模与取舍

Floyd 检环/入口及必要遍历均为 O(n+m) 时间、O(1) 额外空间;n/m 可指两条可达不同节点数,环内重复访问至多一圈。

易错点与追问

容易失分的边界

  • 按节点值判断。
  • 只做无环尾节点比较,遇环无限循环。
  • 认为入口不同就不相交。
  • 一有环一无环时做无限遍历寻找交点。
  • 返回‘第一个共同节点’却未定义环上不同入口的排序。

继续深挖

  • 若要求入环前的第一个交点怎么找?
  • 两个入口不同但同环时怎样返回一个代表节点?
  • 能否在 O(1) 空间做?
  • 外部同时修改 next 时有什么风险?
✓已复制微信号!