您的位置:首页 > 理论基础 > 数据结构算法

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

2014-03-06 19:30 369 查看

题目描述

分别输入两个有序的整数序列(分别包含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 <stdio.h>
#include <stdlib.h>
#include <string.h>

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->data<p->data)
{
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: