7-52 两个有序链表序列的交集(20 分)
已知两个非降序链表序列S1与S2,设计函数构造出S1与S2的交集新链表S3。
输入格式:
输入分两行,分别在每行给出由若干个正整数构成的非降序序列,用−1表示序列的结尾(−1不属于这个序列)。数字用空格间隔。
输出格式:
在一行中输出两个输入序列的交集序列,数字间用空格分开,结尾不能有多余空格;若新链表为空,输出NULL
。
输入样例:
1 2 5 -1
2 4 5 8 10 -1
输出样例:
2 5
#include<iostream>
#include<cstdio>
#include<cstdlib>
using namespace std;
struct node{
int data;
node* next;
};
node* create()
{
int x;
cin>>x;
node* newlist=(node*)malloc(sizeof(node));
if(x==-1){
return NULL;
}
if(x!=-1){
newlist->data=x;
newlist->next=NULL;
}
node* p=newlist;
while(x!=-1){
node* temp=(node*)malloc(sizeof(node));
cin>>x;
if(x!=-1){
temp->data=x;
temp->next=NULL;
p->next=temp;
p=p->next;
}
}
return newlist;
}
void print(node* l){
if(l==NULL){
cout<<"NULL"<<endl;
return;
}
if(l!=NULL){
cout<<l->data;
l=l->next;
}
while(l!=NULL){
cout<<' '<<l->data;
l=l->next;
}
return;
}
int main()
{
node* l1;
l1=create();
node* l2;
l2=create();
if(l1==NULL||l2==NULL){
cout<<"NULL"<<endl;
return 0;
}
node* newlist=(node*)malloc(sizeof(node));
newlist->data=-1;
newlist->next=NULL;
node* p=newlist;
//为减少时间复杂度,考虑两个链表都是有序这一条件
while(l1&&l2){
if(l1->data>l2->data){
l2=l2->next;
}else if(l1->data<l2->data){
l1=l1->next;
}else if(l1->data==l2->data){
node* temp=(node*)malloc(sizeof(node));
temp->data=l1->data;
temp->next=NULL;
p->next=temp;
p=p->next;
l1=l1->next;
l2=l2->next;
}
}
if(newlist->next==NULL){
cout<<"NULL"<<endl;
return 0;
}
if(newlist->next!=NULL){
newlist=newlist->next;
}
print(newlist);
return 0;
}