SDUTOJ 2119 数据结构实验之链表四:有序链表的归并

题目描述

分别输入两个有序的整数序列(分别包含M和N个数据),建立两个有序的单链表,将这两个有序单链表合并成为一个大的有序单链表,并依次输出合并后的单链表数据。

输入

第一行输入M与N的值;
第二行依次输入M个有序的整数;
第三行依次输入N个有序的整数。

输出

输出合并后的单链表所包含的M+N个有序的整数。

示例输入

6 5
1 23 26 45 66 99
14 21 28 50 100

示例输出

1 14 21 23 26 28 45 50 66 99 100

提示

不得使用数组!

这个题如果用数组做,就算是用冒泡再排一下序都不会超时吧,但是这个题要求用链表,我就用链表做了一下都知道调试指针是很费劲的事情,确实是这样,我做的这个题用了大量的指针,参考的同学不要被吓到.....(本解题方法中head节点中没有数据,数据从head->next节点中开始存储,这样有利于链表的插入排序,如果你还不知道链表的插入排序,参考http://blog.csdn.net/codeblf2/article/details/18416513)...


#include 
#include 
#include 

struct linshi
{
    int data;
    struct linshi *next;//创建链表所用的结构体
};

 struct linshi *head1,*head2,*p,*q,*r,*s;//定义全局变量,可以省略函数间传递指针这个麻烦的过/                                         //程

 void set(int);               //函数声明
 void chuli(void);

void set(int k)//创建链表的过程就不多解释了..
{
    int a;
    while(k--)
    {
        scanf("%d",&a);
        q=(struct linshi *)malloc(sizeof(struct linshi)*1);
        q->data=a;
        p->next=q;
        q->next=NULL;
        p=p->next;
    }
    return ;
}

void chuli(void)
{
    r=head2->next;//用r来遍历以head2为首的链表
    while(r!=NULL)
    {
        s=(struct linshi *)malloc(sizeof(struct linshi)*1);//开辟新的链结,以便于添加
        s->data=r->data;//我已开始就死在了这里,一开始我的语句是s=r;但怎么都不对,后来想了想,s=r会对r进行操作,假设s添加在链表的最后,那么r->next必定为空,一定会出错的。
        s->next=NULL;
        p=head1->next;//每次p必须从head1->next开始,否则的话就不准了
        q=head1;//q记录p的上一个节点,以便于插入新的链结
        while(p!=NULL)//下面这些就是链表插入排序了,不多解释,不会的去看http://blog.csdn.net/codeblf2/article/details/18416513
        {
            if(s->datadata)
            {
                q->next=s;
                s->next=p;
                break;
            }
            q=p;
            p=p->next;
        }
        if(p==NULL)
        {
            s->next=NULL;
            q->next=s;
        }
        r=r->next;
    }
    p=head1->next;//下面这些插入排序中也有...
    while(p!=NULL)
    {
        printf("%d",p->data);
        if(p->next!=NULL)
        {
            printf(" ");
        }
        p=p->next;
    }
    printf("\n");
}

int main()
{
    int m=0,n=0;
    head1=(struct linshi *)malloc(sizeof(struct linshi)*1);
    head1->next=NULL;
    head2=(struct linshi *)malloc(sizeof(struct linshi)*1);
    head2->next=NULL;
    p=(struct linshi *)malloc(sizeof(struct linshi)*1);
    q=(struct linshi *)malloc(sizeof(struct linshi)*1);
    r=(struct linshi *)malloc(sizeof(struct linshi)*1);//给上面定义的指针开内存
    scanf("%d%d",&m,&n);
    p=head1;//更新p指针
    set(m);//开始建立第一个链表
    p=head2;
    set(n);//建立第二个链表,因为创建方法一样,所以我就写成了一个函数....
    chuli();
    return 0;
}


你可能感兴趣的:(排序,SDUTOJ,链表)