描述
给你两个有序且升序的数组,请你把它们合成一个升序数组并输出
Give you two ordered ascending array, you put them into one ascending array and output.
输入
第一行为一个正整数n,n<=20 ;
第二行为n个数字,这n个数字用空格隔开
第三行为一个正整数m,m<=20 ;
第四行为M个数字,这m个数字用空格隔开
The first line is a positive integer n, n <= 20;
The second line are n numbers separated by space
The third is a positive integer m, m <= 20;
The fourth line are m numbers separated by space
输出
输出合并后的数组,每个数字占一行,
Output the combined array, each number per line,
输入样例
3
1 3 7
5
2 4 6 8 10
输出样例
1
2
3
4
6
7
8
10
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef int DataType; /*数据类型*/
typedef int ElemType; /*元素类型*/
//----------------线性列表存储结构----------------
typedef struct LNode
{
ElemType data;
struct LNode *next;
}LNode, *LinkList;
void ListCreate(LinkList L, int n)
//创建含有n个结点的链表
{
int i;
LinkList p, q;
p = L;
for(i = 0 ; i < n; i++)
{
q = (LinkList)malloc(sizeof(LNode)); //生成新结点
scanf("%d", &q->data);
q->next = NULL;
p->next = q; //前后结点链接
p = q;
}
}
void ListMerge(LinkList La, LinkList Lb, LinkList Lc)
{
LinkList pa = La->next, pb = Lb->next;
LinkList pc = Lc;
while(pa && pb)
{
if(pa->data <= pb->data)
{
pc ->next = pa;
pc = pa;
pa = pa->next;
}
else
{
pc->next = pb;
pc = pb;
pb = pb->next;
}
}
pc->next = pa?pa:pb; //插入剩余段
free(La);
free(Lb);
}
void ListTraverse(LinkList L)
{
LinkList p = L;
while(p->next)
{
p = p->next;
printf("%d\n", p->data);
}
}
int main()
{
LNode La, Lb, Lc;
int n;
scanf("%d", &n);
ListCreate(&La, n);
scanf("%d", &n);
ListCreate(&Lb, n);
ListMerge(&La, &Lb, &Lc);
ListTraverse(&Lc);
return 0;
}