链表中环的入口结点
方法1,遍历一次,使用额外空间
- 哈希直接存储指针出现的次数,如果重复出现,直接返回即可
class Solution {
public:
unordered_map<ListNode*,int> hashmap;//记录指针及其出现的次数+1
ListNode *entryNodeOfLoop(ListNode *head) {
auto p=head;
int id=1;//因为hashmap默认就是0,如果id初值为0,造成混淆
while(p)//无环将在这里退出
{
if(hashmap[p])
return p;//有环
hashmap[p]=id++;
p=p->next;
}
if(p==NULL) return NULL;//无环
}
};
方法2,遍历一次,常数空间
- 如果只需要标记该点是否遍历过,那么直接修改值就好
class Solution {
public:
ListNode *entryNodeOfLoop(ListNode *head) {
while(head){
if(head->val > 1000){
head->val -= 1000;
return head;
}
head->val += 1000;
head = head->next;
}
return NULL;
}
};
方法3,快慢指针
- 时间复杂度相同,常数空间
class Solution {
public:
ListNode *entryNodeOfLoop(ListNode *head) {
if(head==NULL||head->next==NULL) return NULL;
auto i=head;auto j=head;
while(i&&j)
{
//i走一步,j走两步
i=i->next;
j=j->next;
if(j) j=j->next;
else return NULL;//无环返回NULL
if(i==j)//如果两指针相遇,说明有环
{
j=head;
while(i!=j)
{
i=i->next;
j=j->next;
}
return i;
}
}
return NULL;
}
};
有帮助的话可以点个赞,我会很开心的~
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?