R7-1 两个有序链表序列的交集
分数 20
作者 DS课程组
单位 浙江大学
已知两个非降序链表序列S1与S2,设计函数构造出S1与S2的交集新链表S3。
输入格式:
输入分两行,分别在每行给出由若干个正整数构成的非降序序列,用−1表示序列的结尾(−1不属于这个序列)。数字用空格间隔。
输出格式:
在一行中输出两个输入序列的交集序列,数字间用空格分开,结尾不能有多余空格;若新链表为空,输出NULL
。
输入样例:
1 2 5 -1
2 4 5 8 10 -1
输出样例:
2 5
代码长度限制
16 KB
时间限制
1000 ms
内存限制
64 MB
#include<iostream>
using namespace std;
struct node
{
int val;
node *next;
node(int x):val(x),next(NULL){}
};
int main()
{
//创建并保存头部指针
node *head1=new node(0);
node *head2=new node(0);
//用于输入链表
node *p1=head1,*p2=head2;
//输出操作
int num;
while(cin>>num&&num!=-1)
{
p1->next=new node(num);
p1=p1->next;
}
while(cin>>num&&num!=-1)
{
p2->next=new node(num);
p2=p2->next;
}
//创建第三个头部指针用于合并有序链表
node *head3=new node(0);
node *r=head3;
//创建指针指向链表的数据节点,链表的头部指针一般不放数据
node *p=head1->next;
node *q=head2->next;
while(p&&q)
{
if(p->val<=q->val)
{
r->next=p;
p=p->next;
}else{
r->next=q;
q=q->next;
}
r=r->next;
}
//因为两个链表的长度不一样,比较完之后需要接上多出来的链表数据节点
if(p)r->next=p;
if(q)r->next=q;
//遍历输出新链表,注:输出链表需要从新指针的数据节点开始
node *t=head3->next;
if(t==NULL)cout<<"NULL";
while(t)
{
cout<<t->val;
if(t->next)cout<<" ";
t=t->next;
}
return 0;
}