给定一个链表,如果链表中存在环,则返回到链表中环的起始节点的值,如果没有环,返回null。
样例
给出 -21->10->4->5, tail connects to node index 1,返回10
挑战
不使用额外的空间
分析:
//首先用两个指针,步进分别为1和2,找出验证相交,(P1:步进1,P2:步进2) P1 == P2
//将P2指向链表首节点,P1不变,重新找P1==P2, P2即为起始点
//设环中有n个节点,p2比p1多走一圈有2x=n+x; n=x;可以看出p1实际走了一个环的步数,
//再让p2指向链表头部,p1位置不变,p1,p2每次走一步直到p1==p2; 此时p1指向环的入口。
//再让p2指向链表头部,p1位置不变,p1,p2每次走一步直到p1==p2; 此时p1指向环的入口。
/**
* Definition of ListNode
* class ListNode {
* public:
* int val;
* ListNode *next;
* ListNode(int val) {
* this->val = val;
* this->next = NULL;
* }
* }
*/
class Solution {
public:
/**
* @param head: The first node of linked list.
* @return: The node where the cycle begins.
* if there is no cycle, return null
*/
ListNode *detectCycle(ListNode *head) {
// write your code here
if(!head)
return NULL;
ListNode *P1 = head;
ListNode *P2 = head;
bool hascycle = false;
while (P1 && P2) {
P1 = P1->next;
if(P2->next)
P2 = P2->next->next;
else
return NULL;
if (P1 == P2) {
hascycle = true;
break;
} // head = head->next;
}
if (!hascycle) {
return NULL;
}
P2 = head;
while (P2 != P1){
P2=P2->next;
P1=P1->next;
}
return P2;
}
};