#include <iostream>
#include <unordered_set>
using namespace std;
struct Node
{
int data;
Node* next;
};
int FindMergeNode_Hash(Node *headA, Node *headB);
int main()
{
Node *a = new Node();
Node *b = new Node();
Node *c = new Node();
Node *d = new Node();
Node *e = new Node();
Node *f = new Node();
Node *g = new Node();
a->data=1;
a->next=b;
b->data=2;
b->next=c;
c->data=3;
c->next=d;
d->data=4; // Meeting Point
d->next=e;
e->data=5;
e->next=f;
f->data=6;
f->next=g;
g->data=7;
g->next=NULL;
Node *A = new Node();
Node *B = new Node();
Node *C = new Node();
A->data = 11;
A->next = B;
B->data = 12;
B->next = C;
C->data = 13;
C->next = d;
int ans = FindMergeNode_Hash(A, a);
cout<<"Lists meet at "<<ans<<"\n";
return 0;
}
int FindMergeNode_Hash(Node *headA, Node *headB)
{
cout<<headB->data<<endl;
unordered_set<Node**> h;
while(headA->next)
{
h.insert(&headA);
headA = headA->next;
}
cout<<"Complete\n";
cout<<headB->data; // Stuck here in an infite loop
while(headB->next)
{
unordered_set <Node**>::iterator got = h.find (&headB);
if ( got != h.end() )
return headB->data;
}
return -1;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dW5vcmRlcmVkX3NldD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCnN0cnVjdCBOb2RlCiAgIHsKICAgICAgIGludCBkYXRhOwogICAgICAgTm9kZSogbmV4dDsKICAgfTsKCmludCBGaW5kTWVyZ2VOb2RlX0hhc2goTm9kZSAqaGVhZEEsIE5vZGUgKmhlYWRCKTsKCmludCBtYWluKCkKewogICAgTm9kZSAqYSA9IG5ldyBOb2RlKCk7CiAgICBOb2RlICpiID0gbmV3IE5vZGUoKTsKICAgIE5vZGUgKmMgPSBuZXcgTm9kZSgpOwogICAgTm9kZSAqZCA9IG5ldyBOb2RlKCk7CiAgICBOb2RlICplID0gbmV3IE5vZGUoKTsKICAgIE5vZGUgKmYgPSBuZXcgTm9kZSgpOwogICAgTm9kZSAqZyA9IG5ldyBOb2RlKCk7CgogICAgYS0+ZGF0YT0xOwogICAgYS0+bmV4dD1iOwoKICAgIGItPmRhdGE9MjsKICAgIGItPm5leHQ9YzsKCiAgICBjLT5kYXRhPTM7CiAgICBjLT5uZXh0PWQ7CgogICAgZC0+ZGF0YT00OyAvLyBNZWV0aW5nIFBvaW50CiAgICBkLT5uZXh0PWU7CgogICAgZS0+ZGF0YT01OwogICAgZS0+bmV4dD1mOwoKICAgIGYtPmRhdGE9NjsKICAgIGYtPm5leHQ9ZzsKCiAgICBnLT5kYXRhPTc7CiAgICBnLT5uZXh0PU5VTEw7CgogICAgTm9kZSAqQSA9IG5ldyBOb2RlKCk7CiAgICBOb2RlICpCID0gbmV3IE5vZGUoKTsKICAgIE5vZGUgKkMgPSBuZXcgTm9kZSgpOwoKICAgIEEtPmRhdGEgPSAxMTsKICAgIEEtPm5leHQgPSBCOwoKICAgIEItPmRhdGEgPSAxMjsKICAgIEItPm5leHQgPSBDOwoKICAgIEMtPmRhdGEgPSAxMzsKICAgIEMtPm5leHQgPSBkOwoKICAgIGludCBhbnMgPSBGaW5kTWVyZ2VOb2RlX0hhc2goQSwgYSk7CiAgICBjb3V0PDwiTGlzdHMgbWVldCBhdCAiPDxhbnM8PCJcbiI7CiAgICByZXR1cm4gMDsKfQoKaW50IEZpbmRNZXJnZU5vZGVfSGFzaChOb2RlICpoZWFkQSwgTm9kZSAqaGVhZEIpCnsKCWNvdXQ8PGhlYWRCLT5kYXRhPDxlbmRsOwogICAgdW5vcmRlcmVkX3NldDxOb2RlKio+IGg7CiAgICB3aGlsZShoZWFkQS0+bmV4dCkKICAgIHsKICAgICAgICBoLmluc2VydCgmaGVhZEEpOwogICAgICAgIGhlYWRBID0gaGVhZEEtPm5leHQ7CiAgICB9CiAgICBjb3V0PDwiQ29tcGxldGVcbiI7CiAgICBjb3V0PDxoZWFkQi0+ZGF0YTsgLy8gU3R1Y2sgaGVyZSBpbiBhbiBpbmZpdGUgbG9vcAogICAgd2hpbGUoaGVhZEItPm5leHQpCiAgICB7CiAgICAgICAgdW5vcmRlcmVkX3NldCA8Tm9kZSoqPjo6aXRlcmF0b3IgZ290ID0gaC5maW5kICgmaGVhZEIpOwogICAgICAgIGlmICggZ290ICE9IGguZW5kKCkgKQogICAgICAgICAgICByZXR1cm4gaGVhZEItPmRhdGE7CiAgICB9CiAgICByZXR1cm4gLTE7Cn0=