#include <iostream>
#include <vector>
using namespace std;
typedef struct node
{
int val;
struct node *pNext;
node(int _val) : val(_val), pNext(nullptr) { }
}Node;
int main()
{
std::vector<int> vec;
int nodeValue;
// 构造第一条链表
int n;
cin >> n;
Node *list1 = new Node(-1);
Node *temp1 = list1;
for(int i = 0; i < n; i++)
{
cin >> nodeValue;
Node *newNode = new Node(nodeValue);
temp1->pNext = newNode;
temp1 = temp1->pNext;
}
// 构造第二条链表
int m;
cin >> m;
Node *list2 = new Node(-1);
Node *temp2 = list2;
for(int i = 0; i < m; i++)
{
cin >> nodeValue;
Node *newNode = new Node(nodeValue);
temp2->pNext = newNode;
temp2 = temp2->pNext;
}
temp1 = list1->pNext;
temp2 = list2->pNext;
while(temp1 != nullptr && temp2 != nullptr)
{
// 当temp1的值大于temp2
while(temp1->val > temp2->val && temp2 != nullptr)
temp1 = temp1->pNext;
// 如果temp2的值大于temp1
while(temp2->val > temp1->val && temp2 != nullptr)
temp2 = temp2->pNext;
// 上面遍历之后temp1->val == temp2->val
// 遍历相同的节点, 然后加入到vec中
while(temp1 != nullptr && temp2 != nullptr && temp1->val == temp2->val)
{
vec.push_back(temp1->val);
temp1 = temp1->pNext;
temp2 = temp2->pNext;
}
}
for(const auto & elem : vec)
std::cout << elem << " ";
return 0;
}
#include <iostream>
#include <unordered_set>
#include <queue>
using namespace std;
int main()
{
// 保存最终的结果
unordered_set<int> vec;
// 用来保存可以通知消息的人
queue<int> _qu;
int n, m;
cin >> n >> m;
// m个组
unordered_set<int> groups[m];
int memberNumbers;
int memberId;
// 初始化所有组
for(int i = 0; i < m; ++i)
{
cin >> memberNumbers;
for(int j = 0; j < memberNumbers; ++j)
{
cin >> memberId;
groups[i].insert(memberId);
}
}
// 先把0放进去, 因此0可以通知其他人
_qu.push(0);
// 只要队列中有人,那么就可以去通知其他人
while(!_qu.empty())
{
// 取出队首元素, 去通知其他人
int front = _qu.front();
_qu.pop();
// 通知完成之后,自己的任务结束了,放入最终的vec中就可以了
vec.insert(front);
// 遍历所有的组
for(int i = 0; i < m; ++i)
{
// 如果在这个组中存在front元素, 那就通知整个组
if(groups[i].find(front) != groups[i].end())
{
// 遍历整个组
for(const auto & elem : groups[i])
{
// 不在vec中才插入
if(vec.find(elem) == vec.end())
{
_qu.push(elem);
}
}
}
}
}
std::cout << vec.size();
}
全部评论
(8) 回帖