求有序序列的交集(链表)
问题描述:
使用带头结点的单链表编程:
有两个有序序列,分别表示两个集合。
求它们的交集并输出。
注意:这里要利用到“有序”的特性。
输入说明:
第一行输入序列A的信息:
第一个整数n(0<=n<=100),表示共有n个元素,其后有n个整数,表示n个元素的数据
第一行输入序列B的信息:
第一个整数n(0<=n<=100),表示共有n个元素,其后有n个整数,表示n个元素的数据
注:两个序列输入时保证有序
输出说明:
输出交集的元素序列,输出格式见范例。
如果交集为空,则输出“head–>tail”
输入范例:
4 1 3 5 7
4 1 4 5 8
输出范例:
head–>1–>5–>tail
#include<iostream>
using namespace std;
struct ListNode{
int num;
struct ListNode *next;
};
ListNode *createByTail(int arr[],int len){
ListNode *head=new ListNode;
ListNode *p,*p1;
p=head;
head->next=NULL;
int i=0;
while(i<len){
p1=new ListNode;
p1->num=arr[i];
p->next=p1;
p=p1;
i++;
}
p->next=NULL;
return head;
}
void fun(ListNode *la, ListNode *lb){
ListNode *p1,*p2;
ListNode *pre;
p1=la->next; p2=lb->next;
pre=la;
while(p1!=NULL&&p2!=NULL){
if(p1->num>p2->num){
p2=p2->next;
}else if(p1->num<p2->num){
pre->next=p1->next;
delete p1;
p1=pre->next;
}else{
pre=p1;
p1=p1->next;
p2=p2->next;
}
}
}
void displayListNode(ListNode *head){
ListNode *p;
p=head->next;
cout<<"head-->";
while(p!=NULL){
cout<<p->num;
cout<<"-->";
p=p->next;
}
cout<<"tail"<<endl;
}
int main(){
int n1,n2;
cin>>n1;
int arr1[n1];
for(int i=0;i<n1;i++){
cin>>arr1[i];
}
cin>>n2;
int arr2[n2];
for(int i=0;i<n2;i++){
cin>>arr2[i];
}
ListNode *headA=createByTail(arr1,n1);
ListNode *headB=createByTail(arr2,n2);
fun(headA,headB);
displayListNode(headA);
return 0;
}