题目:给定一个链表,返回链表开始入环的第一个节点。 从链表的头节点开始沿着 next 指针进入环的第一个节点为环的入口节点。如果链表无环,则返回 null。
题解:使用快慢指针确定是否有环,有环时快指针回到链表头,之后两个指针同时移动一步,再次相遇时为入口节点
代码
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};
*/
class Solution {
public:
ListNode* EntryNodeOfLoop(ListNode* pHead) {
ListNode* fast = pHead, *slow = pHead, *ptr = pHead;
while (NULL != fast) {
if (NULL == fast->next) {
break;
}
slow = slow->next;
fast = fast->next->next;
if(slow == fast) {
while (ptr != slow) {
ptr = ptr->next;
slow = slow->next;
}
return slow;
}
}
return NULL;
}
};