7-3 两个有序链表序列的交集
分数 20
全屏浏览题目
切换布局
作者 DS课程组单位 浙江大学
已知两个非降序链表序列S1与S2,设计函数构造出S1与S2的交集新链表S3。
输入格式:
输入分两行,分别在每行给出由若干个正整数构成的非降序序列,用−1表示序列的结尾(−1不属于这个序列)。数字用空格间隔。
输出格式:
在一行中输出两个输入序列的交集序列,数字间用空格分开,结尾不能有多余空格;若新链表为空,输出NULL。
输入样例:
1 2 5 -1
2 4 5 8 10 -1
输出样例:
2 5
如果只是偷懒赶作业,以下逃课即可
#include<bits/stdc++.h>
using namespace std;
int main()
{
vector<int>v1;
vector<int>v2;
int n;
cin >> n;
while (-1 != n)
{
v1.emplace_back(n);
cin >> n;
}
cin >> n;
while (-1 != n)
{
v2.emplace_back(n);
cin >> n;
}
vector<int>v3;
v3.resize(v1.size() + v2.size());
if (!v1.size() || !v2.size())
{
cout << "NULL" << endl;
return 0;
}
auto pos = set_intersection(v1.begin(), v1.end(), v2.begin(), v2.end(), v3.begin());
if(pos==v3.begin())
{
cout<<"NULL"<<endl;
}
for (auto i = v3.begin(); i != pos; i++)
{
cout << *i;
if (i != pos - 1)
cout << " ";
}
return 0;
}
下面是链表的实现
struct List
{
int Data;
List* Next;
List* end;//链表尾的地址
List(int num)
{
this->Data = num;
this->Next = nullptr;
this->end = nullptr;
}
void print(List* L)
{
L = L->Next;
if (!L)cout << "NULL";
while (L)
{
cout << L->Data;
L = L->Next;
if (L)
cout << " ";
}
}
List* creat(List* L)
{
List* head = L;
int n;
cin >> n;
while (-1 != n)
{
List* temp = new List(n);
L->Next = temp;
L = L->Next;
head->end = L;
cin >> n;
}
return head;
}
List* merge(List* L1, List* L2)
{
List* head = new List(-1);
List* L = head;
while (L1 && L2)
{
if (L1->Data > L2->Data)
{
L2 = L2->Next;
}
else if (L2->Data > L1->Data)
{
L1 = L1->Next;
}
else
{
List* T = new List(L1->Data);
L->Next = T;
L = L->Next;
head->end = L;
L1 = L1->Next;
L2 = L2->Next;
}
}
return head;
}
};
int main()
{
List* L1 = new List(-1);
List* L2 = new List(-1);
List* L3 = new List(-1);
L1 = L1->creat(L1);
L2 = L2->creat(L2);
L3 = L3->merge(L1, L2);
L3->print(L3->Next);
return 0;
}