已知两个非降序链表序列S1与S2,设计函数构造出S1与S2的交集新链表S3。
输入格式:
输入分两行,分别在每行给出由若干个正整数构成的非降序序列,用−1表示序列的结尾(−1不属于这个序列)。数字用空格间隔。
输出格式:
在一行中输出两个输入序列的交集序列,数字间用空格分开,结尾不能有多余空格;若新链表为空,输出NULL
。
输入样例:
1 2 5 -1
2 4 5 8 10 -1
输出样例:
2 5
解题思路:
遍历列表1,2,三种情况:
1、Data1>Data2 : List2上的指针向后一位
2、Data1<Data2 : List1上的指针向后一位
3、Data1=Data2 :符合条件,尾插法插入新链表
#include <stdio.h>
#include <stdlib.h>
typedef struct LNode *PtrToLNode;
struct LNode {
int Data;
PtrToLNode Next;
};
typedef PtrToLNode Position;
typedef PtrToLNode List;
PtrToLNode CreateList();
PtrToLNode PrintList();
PtrToLNode CreateList(){
List L=(struct LNode*)malloc(sizeof(struct LNode));//建立新链表
L->Next=NULL;//Next指向地址置为空
List p=L;//新建指针变量进行迭代
int x;
scanf("%d",&x);
while(x!=-1){
List q=(struct LNode*)malloc(sizeof(struct LNode));//建立新结点
q->Next=NULL;
q->Data=x;
p->Next=q;//尾插法
p=q;//迭代
scanf("%d",&x);
}
return L->Next;
}
PtrToLNode PrintList(List Ln){
int cnt=0;
if(Ln->Next==NULL)printf("NULL");
while(Ln->Next!=NULL){
if(cnt==0){
printf("%d",Ln->Next->Data);
cnt=1;
}
else{
printf(" %d",Ln->Next->Data);
}
Ln=Ln->Next;
}
}
int main()
{
List L1=CreateList();
List L2=CreateList();
List p1=L1,p2=L2;
List L3=(struct LNode*)malloc(sizeof(struct LNode));
List r=L3;
while(p1!=NULL&&p2!=NULL){
if(p1->Data<p2->Data){
p1=p1->Next;
}
else if(p1->Data==p2->Data){
List n=(struct LNode*)malloc(sizeof(struct LNode));
n->Next=NULL;
n->Data=p1->Data;
r->Next=n;
r=n;//迭代梅开二度
p1=p1->Next;
p2=p2->Next;
}
else p2=p2->Next;
}
PrintList(L3);
}