7-5 两个有序链表序列的交集 (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>
typedef struct MyNode* NodePoint;
struct MyNode
{
int data;
NodePoint link;
};
void CreateNode(int NodeData, NodePoint* PRear) {
NodePoint P;
P = (NodePoint)malloc(sizeof(struct MyNode));
P->data = NodeData;
P->link = NULL;
(*PRear)->link = P;
*(PRear) = P;
}
NodePoint ReadNode() {
int NodeNum, NodeData;
NodePoint P, Rear, Temp;
std::cin >> NodeNum;
P = (NodePoint)malloc(sizeof(struct MyNode));
P->link = NULL;
Rear = P;
while (NodeNum != -1) {
int TempNum=0;
NodeData=NodeNum;
CreateNode(NodeData, &Rear);
std::cin >> TempNum;
NodeNum=TempNum;
}
Temp = P;
P = P->link;
free(Temp);
//std::cout << "Done" << "\n";
return P;
}
void NodeOut(NodePoint P) {
if(P==NULL){
std::cout<<"NULL";
return;
}
int stats=0;
while (P) {
if(stats==0){
std::cout<<P->data;
stats=1;
} else{
std::cout<<" "<<P->data;
}
P=P->link;
}
}
void NodeAdd1(NodePoint P1, NodePoint P2) {
if(P1==NULL&&P2==NULL){
std::cout<<"NULL";
return;
}
NodePoint P, P0;
P = (NodePoint)malloc(sizeof(struct MyNode));
P0 = P;
for(;P1!=NULL&&P2!=NULL;){
if(P1->data<P2->data){
P1=P1->link;
} else if(P1->data>P2->data){
P2=P2->link;
} else{
NodePoint TempPoint=(NodePoint)malloc(sizeof(struct MyNode));
TempPoint->link=NULL;
TempPoint->data=P1->data;
P0->link=TempPoint;
P0=TempPoint;
P1=P1->link;
P2=P2->link;
}
}
P0->link=NULL;
P=P->link;
NodeOut(P);
}
int main() {
NodePoint P1, P2, P3;
P1 = ReadNode();
P2 = ReadNode();
NodeAdd1(P1, P2);
//NodeOut(P1);
}