#include <iostream>
using namespace std;
class Node {
public:
Node* next;
int id;
Node(int id, Node* next) : id(id), next(next) {}
};
Node* FindLoopBegin(Node *head) {
if(!head) {
return NULL;
}
Node *slowptr = head,*fastptr = head;
do {
fastptr = fastptr->next;
if(fastptr == NULL) {return NULL;}
fastptr = fastptr->next;
slowptr = slowptr->next;
}while(slowptr && fastptr && slowptr != fastptr);
if(slowptr && fastptr && slowptr == fastptr) {
slowptr = head;
while(slowptr != fastptr){
slowptr = slowptr->next;
fastptr = fastptr->next;
}
return slowptr;
}
return NULL;
}
int main()
{
Node* n10 = new Node(10,NULL);
Node* n12 = new Node(12,NULL);
Node* n14 = new Node(14,NULL);
n12->next = n14;
n14->next = n12;
n10->next = n12;
cout<<(FindLoopBegin(n10)->id)<<endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmNsYXNzIE5vZGUgewpwdWJsaWM6CiAgICBOb2RlKiBuZXh0OwogICAgaW50IGlkOwogICAgTm9kZShpbnQgaWQsIE5vZGUqIG5leHQpIDogaWQoaWQpLCBuZXh0KG5leHQpIHt9CiAgICAKfTsKCk5vZGUqIEZpbmRMb29wQmVnaW4oTm9kZSAqaGVhZCkgewoJaWYoIWhlYWQpIHsKCQlyZXR1cm4gTlVMTDsKCX0KICAgIE5vZGUgKnNsb3dwdHIgPSBoZWFkLCpmYXN0cHRyID0gaGVhZDsKICAgIGRvIHsKICAgICAgICBmYXN0cHRyID0gZmFzdHB0ci0+bmV4dDsKICAgICAgICBpZihmYXN0cHRyID09IE5VTEwpIHtyZXR1cm4gTlVMTDt9CiAgICAgICAgZmFzdHB0ciA9IGZhc3RwdHItPm5leHQ7CiAgICAgICAgc2xvd3B0ciA9IHNsb3dwdHItPm5leHQ7CiAgICB9d2hpbGUoc2xvd3B0ciAmJiBmYXN0cHRyICYmIHNsb3dwdHIgIT0gZmFzdHB0cik7CiAgICBpZihzbG93cHRyICYmIGZhc3RwdHIgJiYgc2xvd3B0ciA9PSBmYXN0cHRyKSB7CiAgICAgICAgc2xvd3B0ciA9IGhlYWQ7CiAgICAgICAgd2hpbGUoc2xvd3B0ciAhPSBmYXN0cHRyKXsKICAgICAgICAgICAgc2xvd3B0ciA9IHNsb3dwdHItPm5leHQ7CiAgICAgICAgICAgIGZhc3RwdHIgPSBmYXN0cHRyLT5uZXh0OwogICAgICAgIH0KICAgICAgICByZXR1cm4gc2xvd3B0cjsKICAgIH0gICAKICAgIHJldHVybiBOVUxMOwp9CgppbnQgbWFpbigpCnsKICAgTm9kZSogbjEwID0gbmV3IE5vZGUoMTAsTlVMTCk7CiAgIE5vZGUqIG4xMiA9IG5ldyBOb2RlKDEyLE5VTEwpOwogICBOb2RlKiBuMTQgPSBuZXcgTm9kZSgxNCxOVUxMKTsKICAgbjEyLT5uZXh0ID0gbjE0OwogICBuMTQtPm5leHQgPSBuMTI7CiAgIG4xMC0+bmV4dCA9IG4xMjsKICAgY291dDw8KEZpbmRMb29wQmVnaW4objEwKS0+aWQpPDxlbmRsOwogICByZXR1cm4gMDsKfQ==