已知两个非降序链表序列S1与S2,设计函数构造出S1与S2的交集新链表S3。
输入格式:
输入分两行,分别在每行给出由若干个正整数构成的非降序序列,用−1表示序列的结尾(−1不属于这个序列)。数字用空格间隔。
输出格式:
在一行中输出两个输入序列的交集序列,数字间用空格分开,结尾不能有多余空格;若新链表为空,输出NULL
。
输入样例:
1 2 5 -1
2 4 5 8 10 -1
输出样例:
2 5
#include<iostream>
#include<vector>
using namespace std;
typedef int ElementType;
typedef struct LNode* LinkList;
struct LNode{
ElementType Data;
LinkList Next;
};
LinkList ReadAttach(int temp, LinkList Rear){
// 构造空头节点
LinkList p = (LinkList) malloc(sizeof(LinkList));
p->Next = NULL;
p->Data = temp;
//Rear指向新建结点
Rear->Next = p;
Rear = p;
return Rear;
}
LinkList Read(LinkList L){
L = (LinkList) malloc(sizeof(LinkList));
L->Next = NULL;
L->Data = -1;
// Rear指向最后的节点
LinkList Rear = L;
ElementType temp;
//当输入数据不等于边界元素时执行
while(cin >> temp && temp != -1) Rear = ReadAttach(temp, Rear);
return L;
}
void IntersectAttach(LinkList* Rear, LinkList* temp){
// 指向指针的指针 最后节点连接新节点 并将最后节点指向新节点
(*Rear)->Next = (*temp);
(*Rear) = (*temp);
(*temp) = (*temp)->Next;
}
LinkList Intersect(LinkList La, LinkList Lb){
// 构造空头节点
Lb = (LinkList) malloc(sizeof(LinkList));
Lb->Next = NULL;
Lb->Data = -1;
LinkList Rear = Lb;
// 跳过链表空头节点
La = La->Next;
int temp;
while(cin >> temp && temp != -1){
// 链表一的元素小于读取链表二的数据时 跳过小于部分
while(La->Data < temp && La->Next != NULL) {
La = La->Next;
}
// 当链表一到达空节点时 跳过后面的判断
if(La->Next == NULL) continue;
// 如果读取元素与链表一元素存在交集 则连接交集部分
if(temp == La->Data) IntersectAttach(&Rear, &La);
}
return Lb;
}
void Print(LinkList L){
// omit NULL Node
L = L->Next;
int flag = 0;
while(L){
if(flag == 0){
cout << L->Data;
flag = 1;
}
else{
cout << " " << L->Data;
}
L = L->Next;
}
if(flag == 0) printf("NULL");
}
int main(){
LinkList La, Lb;
La = Read(La);
if(La->Next == NULL) {
cout << "NULL";
return 0;
}
Lb = Intersect(La, Lb);
Print(Lb);
}