非递减有序集合合并
巳知线性表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;
}
结果