7-11 两个有序链表序列的交集 (20 分)

已知两个非降序链表序列S1与S2,设计函数构造出S1与S2的交集新链表S3。
输入格式:
输入分两行,分别在每行给出由若干个正整数构成的非降序序列,用−1表示序列的结尾(−1不属于这个序列)。数字用空格间隔。
输出格式:
在一行中输出两个输入序列的交集序列,数字间用空格分开,结尾不能有多余空格;若新链表为空,输出NULL。
输入样例:
1 2 5 -1
2 4 5 8 10 -1

输出样例:
2 5

#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();
//lower_bound( begin,end,num):从数组的begin位置到end-1位置
//二分查找第一个大于或等于num的数字,找到返回该数字的地址,不存在则返回end。
//通过返回的地址减去起始地址begin,得到找到数字在数组中的下标。
        if (p==vec2.size())
            continue;
        if (vec2[p]==*iter)
        {
            cnt=p+1;
            if ( ! flag )
            {
                cout << *iter;
                flag=1;
            }
            else
                cout<<" "<<*iter;
        }
    }
    if (flag==0)
        cout<<"NULL";
    cout<<endl;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_43589396/article/details/88621668