题目重点:Onsite coding 问两条可能带环的单链表是否共享节点;用 Floyd 入环检测分类无环、一环、双环同入口/异入口。
题意与假设
这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。
- 两条是由 next 指针构成的单链表,以对象身份判断共享节点,值相同不代表交点。
- 返回布尔值;若要求交点节点,双环且环入口不同可能没有唯一‘第一个’交点,需另定义。
解题路线
- 对两条头指针分别用 Floyd 快慢指针检测环,若有环再定位各自入口 e1/e2。
- 两条均无环:比较尾节点身份,或用长度对齐后同速走找交点;布尔问题尾相同即相交。
- 恰一条有环:不可能相交,因为共享节点之后的 next 轨迹唯一,若相交则两条都最终入环。
- 两条都有环且 e1==e2:共享同一环,必相交;也可在入环前长度对齐寻找更早交点。
- 两条都有环但入口不同:从 e1 沿环走一圈,若经过 e2 则共享同一环、相交,否则环不同、不相交。
- 整体判断只读 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 时有什么风险?
