欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

两个有序链表序列的交集

程序员文章站 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 为输入结束标志