题解 | #链表中环的入口结点#
链表中环的入口结点
http://www.nowcoder.com/practice/253d2c59ec3e4bc68da16833f79a38e4
先判断有没有环,若有,设置两个指针,一个指向链表起点,一个指向相遇点,同时开始移动,相遇点即为环的入口节点
class Solution {
public:
ListNode* EntryNodeOfLoop(ListNode* pHead) {
ListNode* meetNode = HasLoop(pHead); //先判断有没有环
if(!meetNode) return nullptr; //没有环,返回空
while(pHead != meetNode){ //两个指针,一个指向链表起点,一个指向相遇点,同时开始移动,相遇点即为环的入口节点
pHead = pHead->next;
meetNode = meetNode->next;
}
return pHead;
}
//用快慢指针判断是否有环,若有,则返回相遇点
ListNode* HasLoop(ListNode* pHead){
if(!pHead) return pHead;
ListNode* fast = pHead;
ListNode* slow = pHead;
while(fast && slow){
slow = slow->next;
if(!fast->next)
return nullptr;
fast = fast->next->next;
if(slow == fast)
return slow;
}
return nullptr;
}
};