数据结构 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 }

 

posted @ 2017-10-26 00:19  cbattle  阅读(1142)  评论(0编辑  收藏  举报