假设我们有三个链表。我们必须找到这三个链接列表中存在的所有常见元素。假设这些列表是[10、12、15、20、25],[10、12、13、15]和[10、12、15、24、25、26],那么这三个列表中的共同元素是10 ,12和15。
我们将使用哈希技术来解决此问题。为了解决这个问题,我们必须遵循以下步骤-
创建一个空的哈希表,遍历第一个表中的每个元素,然后插入元素,并将频率标记为1
遍历第二个链表,然后如果元素的当前频率为1,则使其为2
遍历第三个链表,然后如果元素的当前频率为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