Given three linked lists, find all common element among the three linked lists.

Examples:

Input : 10 15 20 25 12 10 12 13 15 10 12 15 24 25 26 Output : 10 12 15 Input : 1 2 3 4 5 1 2 3 4 6 9 8 1 2 4 5 10 Output : 1 2 4

**Method 1 : (Simple) **

Use three-pointers to iterate the given three linked lists and if any element common print that element.

Time complexity of the above solution will be O(N*N*N)

**Method 2 : (Hashing)**

Create an empty hash table. Iterate through the first linked list and mark all the element frequency as 1 in the hash table. Iterate through the second linked list and if current element frequency is 1 in hash table mark it as 2. Iterate the third linked list and if the current element frequency is 2 in hash table mark it as 3.

Now iterate first linked list again and if you find any element whose frequency become three in hash table that means its common element in between these three linked lists.

Below is the C++ implementation of the above idea.

// C++ program to find common element // in three unsorted linked list #include <bits/stdc++.h> #define max 1000000 using namespace std; /* Link list node */ struct Node { int data; struct Node* next; }; /* A utility function to insert a node at the beginning of a linked list */ void push(struct Node** head_ref, int new_data) { struct Node* new_node = (struct Node *)malloc(sizeof(struct Node)); new_node->data = new_data; new_node->next = (*head_ref); (*head_ref) = new_node; } /* print the common element in between given three linked list*/ void Common(struct Node* head1, struct Node* head2, struct Node* head3) { // Creating empty hash table; unordered_map<int, int> hash; struct Node* p = head1; while (p != NULL) { // set frequency by 1 hash[p->data] = 1; p = p->next; } struct Node* q = head2; while (q != NULL) { // if the element is already exist in the // linked list set its frequency 2 if (hash.find(q->data) != hash.end()) hash[q->data] = 2; q = q->next; } struct Node* r = head3; while (r != NULL) { if (hash.find(r->data) != hash.end() && hash[r->data] == 2) // if the element frquancy is 2 it means // its present in both the first and second // linked list set its frquancy 3 hash[r->data] = 3; r = r->next; } for (auto x : hash) { // if current frequency is 3 its means // element is common in all the given // linked list if (x.second == 3) cout << x.first << " "; } } // Driver code int main() { // first list struct Node* head1 = NULL; push(&head1, 20); push(&head1, 5); push(&head1, 15); push(&head1, 10); // second list struct Node* head2 = NULL; push(&head2, 10); push(&head2, 20); push(&head2, 15); push(&head2, 8); // third list struct Node* head3 = NULL; push(&head3, 10); push(&head3, 2); push(&head3, 15); push(&head3, 20); Common(head1, head2, head3); return 0; }

**Output:**

10 15 20

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above.