★问题描述
本题任务是维护一条非递减的链表,初始长度为0,记这条链表为主链表。对主链表做N次操作,操作分两种:
1 k a1 a2 … ak,表示一条长度为k且非递减的链表,需要将这条链表合并到主链表上,保持合并后的链表仍然是非递减的。
2 x,表示删除主链表中所有值为x的节点,不保证链表中存在x。
最后按非递减顺序输出主链表。
★数据输入
第一行为数据N,表示操作次数。
接下来N行,每行为1 k a1 a2 … ak或2 x。 数据保证: 80%的数据,N <= 1000, Σk <= 1000 100%的数据,N <= 100000, Σk <= 100000, 0 <= a[i] <= 1000000000
★数据输出
一行输出主链表,数据保证最后主链表包含至少一个元素。
★输入示例
3
1 4 1 2 2 3
2 2
1 2 0 4
★输出示例
0 1 3 4
解题思路:
将链表数据用一个数组存储,再将删除节点用另外一个数组存储,然后对这两个数组都进行排序,判断情况分一下依次处理即可,思路简单明确。
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#define MAX 200001
using namespace std;
int N,mod,k;
int dele[MAX],a[MAX];
// dele[]存删除节点,a[]存1时输入的所有节点
int main()
{
int cnt1=0,cnt2=0;
// cnt1为a[]长度,cnt2为dele[]长度
scanf("%d",&N);
for (int i=1;i<=N;i++)
{
scanf("%d",&mod);
if (mod==1)
{
scanf("%d",&k);
for (int i=1;i<=k;i++)
{
scanf("%d",&a[++cnt1]);
}
}
else if (mod==2)
scanf("%d",&dele[++cnt2]);
}
sort(a+1,a+cnt1+1);
sort(dele+1,dele+cnt2+1);
for (int i=1,j=1;i<=cnt1;)
{
if (j>cnt2) //删除节点都处理完了,剩下的数据就不用删了
{
printf("%d ",a[i++]);
}
else if (a[i]<dele[j]) //比删除节点小的数据不需要删
{
printf("%d ",a[i++]);
}
else if (a[i]==dele[j])
i++; // 跳过,不输出,也就是删除
else if (a[i]>dele[j])
j++; // 该处理下一个删除节点了
}
return 0;
}