数据结构 merge_link合并链表
问题描述
本题任务是维护一条非递减的链表,初始长度为 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 |
思路
要插入的数存一数组,要删除的数放另一数组,排序,按顺序判断,得到未删除的元素并输出
code
1 #include <stdio.h> 2 #include <iostream> 3 using namespace std; 4 #include <algorithm> 5 #include <vector> 6 7 int main() 8 { 9 int i,j,u; 10 int n; 11 int op,num,buf; 12 vector<int> vec; 13 vector<int> era; 14 15 scanf("%d",&n); 16 for(i=0;i<n;i++) 17 { 18 scanf("%d %d",&op,&num); 19 if(op==1) 20 { 21 for(j=0;j<num;j++) 22 { 23 scanf("%d",&buf); 24 vec.push_back(buf); 25 } 26 } 27 else // op==2 28 { 29 era.push_back(num); 30 } 31 } 32 sort(vec.begin(),vec.end()); 33 sort(era.begin(),era.end()); 34 for(i=0,j=0; i<vec.size(); ) 35 { 36 if(j==era.size()) 37 { 38 printf("%d ",vec[i++]); 39 } 40 else if(vec[i] < era[j]) 41 { 42 printf("%d ",vec[i++]); 43 } 44 else if(vec[i]==era[j]) 45 { 46 i++; 47 } 48 else if(vec[i] > era[j]) 49 { 50 j++; 51 } 52 else 53 { 54 printf("error\n"); 55 } 56 } 57 58 59 return 0; 60 }