BM7 链表中环的入口结点
题目描述
思路分析
做这道题我第一反应是用“记事本”,也就是将遍历过的节点存储起来,如果下次再遍历到这个节点,那么也就是环的入口节点。遍历节点,如果是遍历过的,那么就直接返回这个节点,否则就将这个节点存起来。理解起来思路比较容易,做起来也比较快。
后来在参考别人的代码时发现它们用的数学方法,我也不太懂,思路大概如下:
代码参考
// 方法一,使用哈希表对对遍历过的链表节点进行保存,
// 如果之前已经遍历过,那么就将它的值设置为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
}
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· DeepSeek在M芯片Mac上本地化部署
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能