7-3 两个有序链表序列的交集(20 分)
7-3 两个有序链表序列的交集(20 分)
已知两个非降序链表序列S1与S2,设计函数构造出S1与S2的交集新链表S3。
输入格式:
输入分两行,分别在每行给出由若干个正整数构成的非降序序列,用−1表示序列的结尾(−1不属于这个序列)。数字用空格间隔。
输出格式:
在一行中输出两个输入序列的交集序列,数字间用空格分开,结尾不能有多余空格;若新链表为空,输出NULL
。
输入样例:
1 2 5 -1
2 4 5 8 10 -1
输出样例:
2 5
思路:这题题意都没有说清楚,假如有重复的数字该怎么处理,而且除了最后一个测试点,其它都没有放重复的数据。提供最后一个测点的的一组数据,我觉得这个题应该改名叫做最长公共子序列。
输入样例: 2 2 -1 2 -1 输出样例: 2 输入样例: 2 -1 2 2 -1 输出样例: 2
以下AC代码:
#include<set> #include<queue> #include<vector> #include<iostream> #include<functional> #include<algorithm> using namespace std; #define ll long long int main() { vector<int>vec1, vec2; vector<int>::iterator iter, iter2; ll cnt; while (cin >> cnt, cnt != -1){ vec1.push_back(cnt); } while (cin >> cnt, cnt != -1){ vec2.push_back(cnt); } int flag = 0; cnt = 0; for (iter = vec1.begin(); iter != vec1.end(); iter++){ int p = lower_bound(vec2.begin()+cnt, vec2.end(), *iter) - vec2.begin(); if (p == vec2.size())continue; if (vec2[p] == *iter){ cnt = p + 1; if (flag == 0){ cout << *iter; flag++; } else cout << " " << *iter; } } if (flag == 0)cout << "NULL"; cout << endl; return 0; }