就地并归两个有序表

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

就地并归两个有序表
任务描述
本关任务:编程实现两个有序表的就地归并。

相关知识
为了完成本关任务,你需要掌握:1.单链表的存储;2.单链表的基本操作。

注意事项
1.已有的两个有序表使⽤带头结点的单链表的存储⽅式
2.归并以后不允许表中有重复元素
3.就地归并
编程要求
⾸先建⽴两个有序单链表,就地归并后输出。

测试说明
平台会对你编写的代码进⾏测试:
7 //输⼊第⼀个表的长度n1
2 4 7 8 10 1
3 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;
}。

相关文档
最新文档