在C ++中的三个链接列表中查找通用元素

假设我们有三个链表。我们必须找到这三个链接列表中存在的所有常见元素。假设这些列表是[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