已知两个非降序链表序列S1与S2,设计函数构造出S1与S2的交集新链表S3。
输入格式:
输入分两行,分别在每行给出由若干个正整数构成的非降序序列,用−1表示序列的结尾(−1不属于这个序列)。数字用空格间隔。
输出格式:
在一行中输出两个输入序列的交集序列,数字间用空格分开,结尾不能有多余空格;若新链表为空,输出NULL
。
算法思路:从head->next开始比较,因为是非降序列,谁小谁往后移,while循环直到其中一个为空。
#include <stdio.h>
#include <stdlib.h>
typedef struct Lnote{
int data;
struct Lnote* next;
}Lnote,*linklist;
Lnote* InitList(){
Lnote* head,*stm,*p;
head=(Lnote*)malloc(sizeof(Lnote));
stm=head;
while(1){
p=(Lnote*)malloc(sizeof(Lnote));
scanf("%d ",&p->data);
if(p->data==-1){
free(p);
break;
}
stm->next=p;
stm=p;
}
stm->next=NULL;
return head;
}
int main(){
Lnote* head1=InitList();
Lnote* head2=InitList();
Lnote* L1=head1->next;
Lnote* L2=head2->next;
if(!L1||!L2){
printf("NULL");
}
else{
int flag=0;
while(L1!=NULL&&L2!=NULL){
if(L1->data>L2->data){
L2=L2->next;
}
else if(L1->data<L2->data){
L1=L1->next;
}
else{
if(flag){
printf(" ");
}
printf("%d",L1->data);
flag=1;
L1 = L1->next;
L2=L2->next;
}
}
if(!flag){
printf("NULL");
}
}
return 0;
}