两个有序链表序列的交集
程序员文章站
2022-06-07 21:44:52
...
题目描述
已知两个非降序链表序列S1与S2,设计函数构造出S1与S2的交集新链表S3。
输入描述
输入分两行,分别在每行给出由若干个正整数构成的非降序序列,用−1表示序列的结尾(−1不属于这个序列)。数字用空格间隔。
输出描述
在一行中输出两个输入序列的交集序列,数字间用空格分开,结尾不能有多余空格;若新链表为空,输出NULL。
#include <stdio.h>
#include <stdlib.h>
typedef struct node //创建链表结构
{
int data;
struct node *next;
}node, *lk;
void Init(lk *l){ //创建头结点
(*l) = (lk)malloc(sizeof(node));
(*l)->next = NULL;
}
void creat(lk l){ //创建链表
int num;
lk tmp;
lk p;
tmp = l;
scanf("%d", &num);
while(1){
p = (lk)malloc(sizeof(node));
if(num==-1)
{
break;
}
p->data = num;
p->next = NULL;
tmp->next = p;
tmp = p;
scanf("%d", &num);
}
}
void show(lk l){ //打印链表
l = l->next;
if(l==NULL)
{
printf("NULL\n");
}
else
{
while(l){
if(l->next!=NULL){
printf("%d ", l->data);
}
else{
printf("%d", l->data);
}
l = l->next;
}
printf("");
}
}
void merge(lk a,lk b, lk *c) //求有序链表的交集
{
lk la,lb,lc;
la = a->next;
lb = b->next;
(*c)=lc=b;
while(la&&lb)
{
if(la->data==lb->data)
{
lc->next = la;
lc = la;
la = la->next;
}
else if(lb->data<la->data)
{
lb = lb->next;
}
else{
la = la->next;
}
}
}
int main() //主函数
{
lk a,b,c;
Init(&a);
Init(&b);
Init(&c);
creat(a);
creat(b);
merge(a,b,&c);
show(c);
return 0;
}
-1 为输入结束标志
上一篇: 【树】树的同构