小小袂

就地并归两个有序表

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

相关知识
为了完成本关任务,你需要掌握: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;
}

posted on 2021-06-17 12:56  就系菜鸡鸭  阅读(563)  评论(0编辑  收藏  举报

导航