题解 | #链表中环的入口结点#
链表中环的入口结点
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) {
//如果头节点或头节点下一个为空返回空
if(pHead==nullptr||pHead->next==nullptr){
return nullptr;
}
//创建快慢指针让它们在头结点的位置
ListNode* fast=pHead;
ListNode* slow=pHead;
//让快指针走两步慢指针走一步
while(fast!=nullptr&&fast->next!=nullptr){
fast=(fast->next)->next;
slow=slow->next;
//当快慢指针相遇跳出循环
if(fast==slow){
break;
}
}
//判断是否有环
if(fast==nullptr||fast->next==nullptr){
return nullptr;
}
//把快指针放回头节点
fast=pHead;
//当快慢指针又相遇时出循环
while(fast!=slow){
fast=fast->next;
slow=slow->next;
}
//此时快慢指针即为入环节点
return slow;
}
};
