สมมติว่ามี Linked List 3 รายการ เราต้องหาองค์ประกอบทั่วไปทั้งหมดที่มีอยู่ใน Linked List ทั้งสาม สมมติว่ารายการเหล่านี้คือ [10, 12, 15, 20, 25], [10, 12, 13, 15] และ [10, 12, 15, 24, 25, 26] องค์ประกอบทั่วไปในรายการทั้งสามคือ 10, 12 และ 15
เราจะใช้เทคนิคการแฮช (Hashing) เพื่อแก้ปัญหานี้ เพื่อแก้ปัญหานี้ เราต้องทำตามขั้นตอนเหล่านี้:
- สร้างตารางแฮشว่าง และผ่านแต่ละองค์ประกอบในรายการแรก แล้วแทรกองค์ประกอบและทำเครื่องหมายความถี่เป็น 1
- วนผ่าน Linked List ที่สอง หากความถี่ปัจจุบันเป็น 1 สำหรับองค์ประกอบนั้น ให้ทำให้เป็น 2
- วนผ่าน Linked List ที่สาม หากความถี่ปัจจุบันเป็น 2 สำหรับองค์ประกอบนั้น ให้ทำให้เป็น 3
- ตอนนี้วนผ่านรายการแรกอีกครั้งเพื่อตรวจสอบความถี่ขององค์ประกอบ หากมีองค์ประกอบบางตัวที่ความถี่เป็น 3 ให้พิมพ์องค์ประกอบนั้น และไปต่อ
ตัวอย่าง
#include <iostream>
#include <cmath>
#include <unordered_map>
using namespace std;
class Node {
public:
int data;
Node* next;
};
void addNode(Node** start, int data) {
Node* newNode = new Node;
newNode->data = data;
newNode->next = (*start);
(*start) = newNode;
}
void findCommonValues(Node* list1, Node* list2, Node* list3) {
unordered_map<int, int> hash;
Node* p = list1;
while (p != NULL) {
hash[p->data] = 1;
p = p->next;
}
Node* q = list2;
while (q != NULL) {
if (hash.find(q->data) != hash.end()) hash[q->data] = 2;
q = q->next;
}
Node* r = list3;
while (r != NULL) {
if (hash.find(r->data) != hash.end() && hash[r->data] == 2)
hash[r->data] = 3;
r = r->next;
}
for (auto x : hash) {
if (x.second == 3)
cout << x.first << " ";
}
}
int main() {
Node* list1 = NULL;
addNode(&list1, 10);
addNode(&list1, 12);
addNode(&list1, 15);
addNode(&list1, 20);
addNode(&list1, 25);
Node* list2 = NULL;
addNode(&list2, 10);
addNode(&list2, 12);
addNode(&list2, 13);
addNode(&list2, 15);
Node* list3 = NULL;
addNode(&list3, 10);
addNode(&list3, 12);
addNode(&list3, 15);
addNode(&list3, 24);
addNode(&list3, 25);
addNode(&list3, 26);
cout << "Common elements are: ";
findCommonValues(list1, list2, list3);
}
ผลลัพธ์
Common elements are: 10 12 15