查詢三個連結串列中共同的元素 (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

更新於:2019年12月19日

166 次瀏覽

開啟你的職業生涯

完成課程獲得認證

開始學習
廣告
© . All rights reserved.