两个有序链表序列的交集

已知两个非降序链表序列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;
//	}
}