剑指offer-链表中环的入口结点C++实现
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};
class Solution {
public:
ListNode* EntryNodeOfLoop(ListNode* head) {
quick = head;
slow = head;
if(quick==nullptr)return nullptr;
while(quick!=nullptr){
// 慢指针走一步
slow = slow->next;
// 防止溢出,空指针指向其他指针的问题
if(quick->next==nullptr) return nullptr;
// 快指针走两步
quick = quick->next->next;
// 第一次相遇,快指针回到头部,再次相遇就是入口
if(quick==slow){
quick = head;
while(quick!=slow){
quick = quick->next;
slow = slow->next;
}
return slow;
}
}
return nullptr;
}
private:
ListNode *quick = nullptr;
ListNode *slow = nullptr;
};
思路:
本题思路是快慢指针,利用快慢指针判断环的路口。快指针每次走两步,慢指针走一步,若无环路,则快指针走到尾部时,下一个指向空,若有环路,那么在快慢指针第一次相遇后,将快指针指向头部,快指针走一步, 快慢指针再一次相遇时,则到了环的路口。
时间复杂度为O(n),空间复杂度为O(1)