#include <bits/stdc++.h>
using namespace std;
// Data Structure to store a linked list node
struct Node
{
int data;
Node* next;
};
// Helper function to print given linked list
void printList(struct Node* head)
{
struct Node* ptr = head;
while (ptr)
{
cout << ptr->data << " -> ";
ptr = ptr->next;
}
cout << "nullptr\n";
}
// Helper function to insert a new node in the beginning of the linked list
void push(struct Node** headRef, int data)
{
struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));
newNode->data = data;
newNode->next = *headRef;
*headRef = newNode;
}
// Compute a new sorted list that represents the intersection of the
// two given sorted lists. This solution uses the local reference
struct Node* SortedIntersect(struct Node* a, struct Node* b)
{
struct Node *head = nullptr;
struct Node* tail = nullptr;
while (a != nullptr && b != nullptr) {
if (a->data == b->data) {
if(head == nullptr) {
push(&head, a->data);
tail=head;
} else {
push(&tail->next, a->data);
tail=tail->next;
}
a = a->next;
b = b->next;
} else if (a->data < b->data)
a = a->next;
else
b = b->next;
}
return head;
}
// main method
int main()
{
// input keys
int keys[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int n = sizeof(keys)/sizeof(keys[0]);
struct Node *a = nullptr;
for (int i = n - 1; i >=0; i = i - 3)
push(&a, keys[i]);
struct Node *b = nullptr;
for (int i = n - 1; i >=0; i = i - 2)
push(&b, keys[i]);
// print both linked list
cout << "First List - ";
printList(a);
cout << "Second List - ";
printList(b);
struct Node *head = SortedIntersect(a, b);
cout << "\nAfter Intersection - ";
printList(head);
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgovLyBEYXRhIFN0cnVjdHVyZSB0byBzdG9yZSBhIGxpbmtlZCBsaXN0IG5vZGUKc3RydWN0IE5vZGUKewoJaW50IGRhdGE7CglOb2RlKiBuZXh0Owp9OwoKLy8gSGVscGVyIGZ1bmN0aW9uIHRvIHByaW50IGdpdmVuIGxpbmtlZCBsaXN0CnZvaWQgcHJpbnRMaXN0KHN0cnVjdCBOb2RlKiBoZWFkKQp7CglzdHJ1Y3QgTm9kZSogcHRyID0gaGVhZDsKCXdoaWxlIChwdHIpCgl7CgkJY291dCA8PCBwdHItPmRhdGEgPDwgIiAtPiAiOwoJCXB0ciA9IHB0ci0+bmV4dDsKCX0KCgljb3V0IDw8ICJudWxscHRyXG4iOwp9CgovLyBIZWxwZXIgZnVuY3Rpb24gdG8gaW5zZXJ0IGEgbmV3IG5vZGUgaW4gdGhlIGJlZ2lubmluZyBvZiB0aGUgbGlua2VkIGxpc3QKdm9pZCBwdXNoKHN0cnVjdCBOb2RlKiogaGVhZFJlZiwgaW50IGRhdGEpCnsKCXN0cnVjdCBOb2RlKiBuZXdOb2RlID0gKHN0cnVjdCBOb2RlKiltYWxsb2Moc2l6ZW9mKHN0cnVjdCBOb2RlKSk7CgluZXdOb2RlLT5kYXRhID0gZGF0YTsKCW5ld05vZGUtPm5leHQgPSAqaGVhZFJlZjsKCSpoZWFkUmVmID0gbmV3Tm9kZTsKfQoKLy8gQ29tcHV0ZSBhIG5ldyBzb3J0ZWQgbGlzdCB0aGF0IHJlcHJlc2VudHMgdGhlIGludGVyc2VjdGlvbiBvZiB0aGUKLy8gdHdvIGdpdmVuIHNvcnRlZCBsaXN0cy4gVGhpcyBzb2x1dGlvbiB1c2VzIHRoZSBsb2NhbCByZWZlcmVuY2UKc3RydWN0IE5vZGUqIFNvcnRlZEludGVyc2VjdChzdHJ1Y3QgTm9kZSogYSwgc3RydWN0IE5vZGUqIGIpCnsKCXN0cnVjdCBOb2RlICpoZWFkID0gbnVsbHB0cjsKCXN0cnVjdCBOb2RlKiB0YWlsID0gbnVsbHB0cjsKCgl3aGlsZSAoYSAhPSBudWxscHRyICYmIGIgIT0gbnVsbHB0cikgewoJCWlmIChhLT5kYXRhID09IGItPmRhdGEpIHsKCQkJaWYoaGVhZCA9PSBudWxscHRyKSB7CgkJCQlwdXNoKCZoZWFkLCBhLT5kYXRhKTsKCQkJCXRhaWw9aGVhZDsKCQkJfSBlbHNlIHsKCQkJCXB1c2goJnRhaWwtPm5leHQsIGEtPmRhdGEpOwoJCQkJdGFpbD10YWlsLT5uZXh0OwoJCQl9CiAKCQkJYSA9IGEtPm5leHQ7CgkJCWIgPSBiLT5uZXh0OwoJCX0gZWxzZSBpZiAoYS0+ZGF0YSA8IGItPmRhdGEpCgkJCWEgPSBhLT5uZXh0OwoJCWVsc2UKCQkJYiA9IGItPm5leHQ7Cgl9CglyZXR1cm4gaGVhZDsKfQoKLy8gbWFpbiBtZXRob2QKaW50IG1haW4oKQp7CgkvLyBpbnB1dCBrZXlzCglpbnQga2V5c1tdID0geyAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCB9OwoJaW50IG4gPSBzaXplb2Yoa2V5cykvc2l6ZW9mKGtleXNbMF0pOwoKCXN0cnVjdCBOb2RlICphID0gbnVsbHB0cjsKCWZvciAoaW50IGkgPSBuIC0gMTsgaSA+PTA7IGkgPSBpIC0gMykKCQlwdXNoKCZhLCBrZXlzW2ldKTsKCiAgICBzdHJ1Y3QgTm9kZSAqYiA9IG51bGxwdHI7Cglmb3IgKGludCBpID0gbiAtIDE7IGkgPj0wOyBpID0gaSAtIDIpCgkJcHVzaCgmYiwga2V5c1tpXSk7CgogICAgLy8gcHJpbnQgYm90aCBsaW5rZWQgbGlzdAoJY291dCA8PCAiRmlyc3QgTGlzdCAgLSAiOwoJcHJpbnRMaXN0KGEpOwoKCWNvdXQgPDwgIlNlY29uZCBMaXN0IC0gIjsKCXByaW50TGlzdChiKTsKCglzdHJ1Y3QgTm9kZSAqaGVhZCA9IFNvcnRlZEludGVyc2VjdChhLCBiKTsKCgljb3V0IDw8ICJcbkFmdGVyIEludGVyc2VjdGlvbiAtICI7CglwcmludExpc3QoaGVhZCk7CgoJcmV0dXJuIDA7Cn0K