非递减有序集合合并-链表

非递减有序集合合并

巳知线性表LA和线性表LB中的数据元素按值非递减有序排列,现要求将LA和LB归并为一个新的线性表LC,且LC中的元素仍按值非递减有序排列。

输入
三行,第一行A,B集合的个数n,m
第二行:集合A的数据;
第三行:集合B的数据。

输出
二行,第一行,集合C的个数k
第二行:集合C的数据。

样例输入
11 12
2 4 6 7 8 9 12 34 56 78 89
3 5 7 9 12 34 56 98 234 456 789 1234

样例输出
18
2 3 4 5 6 7 8 9 12 34 56 78 89 98 234 456 789 1234

#include<stdio.h>
#include<stdlib.h>
#define N 250 
#define INIT 10 
typedef int ElemType;

typedef struct LNode{
	ElemType data;
	struct LNode *next;
}LNode,*LinkList;


void createList(LinkList &l,int a[N],int n){
	LinkList p,r; 
	int i;
	l=(LNode*)malloc(sizeof(LNode)*INIT);
	r=l;
	for(i=0;i<n;i++){
		p=(LinkList)malloc(sizeof(LNode)*INIT);//新建节点p 
		p->data=a[i]; //数组值赋给链表的数值域 
		r->next=p;	  //r指向p,p为链表最后一个节点 
		r=p;		  //r移动到链表最后一个节点的位置,r的位置在不断变化 
	}
	r->next=NULL;//r在链表的末尾,将r指向置为空 
	
} 


int mergeList(LinkList &l1,LinkList &l2,LinkList &l3){
	int i=0;
	LinkList p,q,r;
	l3=(LNode*)malloc(sizeof(LNode)*INIT);//创建新链表l3
	 
	r=l3; //使r指向l3末尾 
	p=l1->next;//p指向l1头节点 
	q=l2->next;//q指向l2头节点 
	while(p&&q){ 
		if(p->data<q->data){//若此时l1元素小于l2,将l1值放进l3中 
			r->next=p;
			r=p;
			p=p->next;
			i++;
		}
		else if(p->data>q->data){//若此时l2元素小于l1,将l2值放进l3中 
			r->next=q;
			r=q;
			q=q->next; 
			i++;
		}
		else{//若相等,将值放入l3,并同时是p,q往后移动 
			r->next=p;
			r=p;
			p=p->next;
			q=q->next;
			i++;
		}
	}
	
	while(p){//若q已遍历完,p未遍历完 
		r->next=p;//将值依次放入l3 
		r=p;
		p=p->next;
		i++;
	}
	
	while(q){
		r->next=q;
		r=q;
		q=q->next;
		i++;
	}
	r->next=NULL; //r在链表的末尾,将r指向置为空 
	
	return i;//返回合并后集合中的元素个数 
}

void print(LinkList &l3){
	LinkList p;
	p=l3->next;
	while(p){
		printf("%d ",p->data);
		p=p->next;
	}
}

int main(){
	int i,a[N],b[N],n1,n2,n3;
	LinkList l1,l2,l3;
	scanf("%d%d",&n1,&n2);
	for(i=0;i<n1;i++)
		scanf("%d",&a[i]);
		
	for(i=0;i<n2;i++)
		scanf("%d",&b[i]);
			
	createList(l1,a,n1);//创建l1 
	createList(l2,b,n2);//创建l2 
	n3=mergeList(l1,l2,l3);//合并集合 
	printf("%d\n",n3);
	print(l3);//输出集合 
	return 0;
} 


结果在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值