就地并归两个有序表
任务描述
本关任务:编程实现两个有序表的就地归并。
相关知识
为了完成本关任务,你需要掌握:1.单链表的存储;2.单链表的基本操作。
注意事项
1.已有的两个有序表使用带头结点的单链表的存储方式
2.归并以后不允许表中有重复元素
3.就地归并
编程要求
首先建立两个有序单链表,就地归并后输出。
测试说明
平台会对你编写的代码进行测试:
7 //输入第一个表的长度n1
2 4 7 8 10 13 18 //依次输入n1个有序的元素
5 /输入第一个表的长度n2
3 4 5 6 9 //依次输入n2个有序的元素
预期输出:
归并表为:2 3 4 5 6 7 8 9 10 13 18
代码实现:
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#define N 20
void Merge(int a[],int p, int q,int r)
{
int result[N];
int k=0;
int i=p;
int j=q+1;
while(i<=q && j<=r){
if(a[i]<a[j]){
result[k++]=a[i++];
}
else {
result[k++]=a[j++];
}
}
if(i==q+1){
while(j<=r){
result[k++]=a[j++];
}
}
if(j=r+1){
while(i<=q){
result[k++]=a[i++];
}
}
for(j=0,i=p;j<k;i++,j++){
a[i]=result[j];
}
}
void Mergesort(int a[],int p, int r)
{
int q;
if(p<r)
{
q=(p+r)/2;
Mergesort(a,p,q);
Mergesort(a,q+1,r);
Merge(a,p,q,r);
}
}
int main( void )
{
int a[]={2, 3, 4, 5, 6, 7, 8, 9, 10, 13, 18};
Mergesort(a,0,9);
int m=0;
for(m=0;m<11;m++)
printf("%d ",a[m]);
return 0;
}