题目描述
给一个长度为n链表,若其中包含环,请找出该链表的环的入口结点,否则,返回null。
数据范围: n≤10000,1<=结点值<=10000
要求:空间复杂度O(1),时间复杂度 O(n)
输入:一个链表头结点pHead
输出:链表中环的入口结点(没找到时返回空指针)
例如,有环形链表如下图所示:
(更多博文,欢迎来我的博客学习交流have_a_cat的博客_CSDN博客-PHP,C/C++,Dcat-Admin框架领域博主)
可以看到环的入口结点的值为3,所以返回值为3的结点。
给大家上个牛客网的该题目刷题链接(NC3 链表中 环的入口结点 )
题目分析
其实题目很简单,就是找到链表的环,输出这个环中你遇到的第一个结点。
那么思路就是:从链表头结点开始遍历,一边遍历一边标记,等二次遇到标记过的结点时,就返回这个结点。
标记用什么呢?
发现,哎?1<=结点值<=10000,这说明结点值全是正的呀,那有猫彬 把遍历过的结点取相反数变成负数就算标记了呀,完美!
求解过程
(更多博文,欢迎来我的博客学习交流have_a_cat的博客_CSDN博客-PHP,C/C++,Dcat-Admin框架领域博主)
①从链表头开始依次遍历,如果该结点值为正,则将该结点的值乘(-1),变成负数;
如果该结点的值为负,那说明成环了,将该结点的值乘(-1),变成正数,并return返回该结点,程序结束。
②如果一直遍历到了链表结尾,那说明该链表没有环,输出NULL
代码
(更多博文,欢迎来我的博客学习交流have_a_cat的博客_CSDN博客-PHP,C/C++,Dcat-Admin框架领域博主)
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};
*/
class Solution {
public:
ListNode* EntryNodeOfLoop(ListNode* pHead) {
ListNode* f = NULL;/* 输出 */
ListNode* p = pHead;
while(p!=NULL){
if((p->val) > 0){
p->val = -(p->val); /* 遍历后标记为负数 */
p = p->next;
}else{/* 发现当前链表是个环 */
p->val = -(p->val);/* 输出前记得将链表的值恢复为正数 */
f = p;
break;/* 退出循环遍历 并输出 */
}
}
return f;
}
};
顺手起来,解题也就三五分钟。
——2022年2月16日 星期三