两个有序链表序列的交集
已知两个非降序链表序列S1与S2,设计函数构造出S1与S2的交集新链表S3。
输入格式:
输入分两行,分别在每行给出由若干个正整数构成的非降序序列,用−1表示序列的结尾(−1不属于这个序列)。数字用空格间隔。
输出格式:
在一行中输出两个输入序列的交集序列,数字间用空格分开,结尾不能有多余空格;若新链表为空,输出NULL。
输入样例:
1 2 5 -1
2 4 5 8 10 -1
输出样例:
2 5
加//部分为合并两条链表的代码,因为一开始看错了题,所以写成了这个,之后也不舍得删除了,所以合并链表的代码也就没有测试,应该是对的,可能在更改成交集的过程中可能会出现一些在原来基础上的改动,不过应该影响不大。
#include<iostream>
#include<malloc.h>
using namespace std;
typedef struct node * list;
struct node {
int data;
list next;
};
list headinsert(list l,int a) {
if(l==NULL) {
l=(list)malloc(sizeof(node));
l->data=a;
l->next=NULL;
return l;
}
list t=(list)malloc(sizeof(node));
t->data=a;
t->next=l;
l=t;
return l;
}
list tailinsert(list l,int a,list &end){
if(end==NULL){
l=(list)malloc(sizeof(node));
l->data=a;
l->next=NULL;
end=l;
return l;
}
list t=(list)malloc(sizeof(node));
t->data=a;
t->next=NULL;
end->next=t;
end=t;
return l;
}
int main() {
list l1=NULL,l2=NULL,end=NULL;
int n;
while(cin>>n,n!=-1){
l1=tailinsert(l1,n,end);
}
end=NULL;
while(cin>>n,n!=-1){
l2=tailinsert(l2,n,end);
}
end=NULL;
list ans=NULL,ret;
int flag=0;
while(l1&&l2){
// if(ans==NULL){
// if(l1->data<=l2->data)ans=l1,ret=l1;
// else
// ans=l2,ret=l2;
// }else if(l1->data<=l2->data){
// list tmp=l1;
// l1=l1->next;
// ans->next=l1;
// }else{
// list tmp=l2;
// l2=l2->next;
// ans->next=l2;
// }
if(l1->data==l2->data){
if(flag==0)flag=1;
else cout<<' ';
cout<<l2->data;
l2=l2->next;
l1=l1->next;
}else if(l1->data<=l2->data){
l1=l1->next;
}else l2=l2->next;
}
if(flag==0)cout<<"NULL";
// if(l1){
// ans->next=l1;
// }else{
// ans->next=l2;
// }
// while(ret!=NULL){
// cout<<ret->data<<' ';
// ret=ret->next;
// }
}