题解 | #链表中环的入口结点#
链表中环的入口结点
https://www.nowcoder.com/practice/253d2c59ec3e4bc68da16833f79a38e4
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};
*/
class Solution {
public:
ListNode* EntryNodeOfLoop(ListNode* pHead) {
// unordered_set<ListNode *> st;
// while (pHead)
// {
// if (st.count(pHead))
// {
// return pHead; // 若已经记录过,直接返回
// }
// st.insert(pHead); // 记录当前结点
// pHead = pHead->next;
// }
// return nullptr; // 无环
ListNode *fast = pHead, *slow = pHead; // 快慢指针都指向头节点
// 循环快指针是否为空
while (fast)
{
// 慢指针走一步
slow = slow->next;
// 如果快指针为空了,直接返回null 说明无环
if (fast->next == NULL)
{
return NULL;
}
// 否则快指针走两步
fast = fast->next->next;
// 如果两个指针相交,此时慢指针已经走了nb步
if (fast == slow)
{
// 快指针重新指向头节点,再遍历一次(这次是要每次走一步即可),
// 直到两个指针相遇为止,然后返回快指针节点即可
fast = pHead;
while (fast != slow)
{
fast = fast->next;
slow = slow->next;
}
return fast; // 找到入口节点,直接返回
}
}
return NULL;
}
};

网易游戏公司福利 555人发布