运用双指针求解,快指针和慢指针,快指针一次移动两个结点,慢指针一次移动一个结点。
1、如果链表中有环结构,先用双指针找到环内的结点;
2、再将其中一个指针移动到头结点,两个结点同时每次移动一个结点,下次相遇时就是环的入口结点
时间复杂度:o(n)
空间复杂度:o(1)
class Solution {
public:
ListNode* EntryNodeOfLoop(ListNode* pHead) {
//特殊情况处理
if (pHead == nullptr || pHead->next == nullptr)
return nullptr;
ListNode* slow = pHead;
ListNode* fast = pHead;
ListNode* pnode = nullptr;
//如果链表中有环结构,先用双指针找到环内的结点
while (fast != nullptr && fast->next != nullptr) {
slow = slow->next;
fast = fast->next->next;
if (slow == fast) {
pnode = slow;
break;
}
}
//得到环的入口结点
if (pnode != nullptr) {
while (pHead != pnode) {
pHead = pHead->next;
pnode = pnode->next;
}
return pnode;
} else {
return nullptr;
}
}
};

京公网安备 11010502036488号