您的位置:首页 > 其它

链表——两个有序链表序列的交集

2017-12-20 19:27 507 查看
已知两个非降序链表序列S1与S2,设计函数构造出S1与S2的交集新链表S3。


输入格式:

输入分两行,分别在每行给出由若干个正整数构成的非降序序列,用−表示序列的结尾(−不属于这个序列)。数字用空格间隔。


输出格式:

在一行中输出两个输入序列的交集序列,数字间用空格分开,结尾不能有多余空格;若新链表为空,输出
NULL


输入样例:

1 2 5 -1
2 4 5 8 10 -1


输出样例:

2 5

#include<bits/stdc++.h>
using namespace std;
#define OK 1
#define ERROR 0
typedef int Status;
typedef int ElemType;
typedef struct LNode *List;
typedef struct LNode
{
ElemType data;
struct LNode *next;
} LNode,*LinkList;

Status InitList(LinkList &L)
{
L = new LNode;
L -> next = NULL;
return OK;
}
Status IsEmpty(LinkList &L)
{
if(L == NULL || L -> next == NULL)
{
return OK;
}
else
return ERROR;
}
Status CreatList(LinkList &L)
{
LNode *p,*q;
L = new LNode;
L -> next  = NULL;
q = new LNode;
p = L;
ElemType tmp;
cin>>tmp;
while(tmp != -1)
{
q -> data = tmp;
q -> next = NULL;
p -> next = q;
p = q;
q = new LNode;
cin>>tmp;
}
}
void PrintList(LinkList &L)
{
LNode *p = L ->next;
while(p)
{
if(p -> next == NULL)
{
cout<<p -> data<<endl;
}
else
cout<<p -> data<<" ";
p = p -> next;
}
}
//需O(min(N1,N2))时间。
//可以令结点指针P1指向S1的首结点,
//P2指向S2首结点,不断比较P1与P2所指结点的值:
//若两结点值相等,则创建新结点将这个值插入到新链表S3的末尾,
//并将P1与P2分别往前移(P=P->next);
//若不相等,将较小结点的对应结点指针往前移。
//创建结点时,注意用malloc函数申请内存;
//由于每次总是插入S3末尾,可以用指针变量pRear指向S3尾结点,
//添加新结点时插入pRear结点之后并更新pRear。
void IntersectList(LinkList &L1,LinkList &L2,LinkList &L3)
{
LNode *p1,*p2,*p3,*p;
p1= L1 -> next;
p2 = L2 ->next;
p3 = L3;
while(p1 && p2)
{
if(p1 -> data < p2 -> data)
{
p1 = p1 -> next;
}
else if(p1 -> data > p2 -> data)
{
p2 = p2 -> next;
}
else if(p1 -> data == p2 -> data)
{
p = new LNode;
p -> data = p1 -> data;
p -> next = NULL;
p3 -> next = p;
p3 = p;
p1 = p1 -> next;
p2 = p2 -> next;
}
}
}

int main()
{
LinkList L1,L2,L3;
InitList(L1);
InitList(L2);
InitList(L3);

CreatList(L1);
CreatList(L2);

IntersectList(L1,L2,L3);
if(IsEmpty(L3))
{
cout<<"NULL"<<endl;
}
else
PrintList(L3);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: