数据结构实验之链表四:有序链表的归并
Time Limit: 1000 ms Memory Limit: 65536 KiB
Problem Description
分别输入两个有序的整数序列(分别包含M和N个数据),建立两个有序的单链表,将这两个有序单链表合并成为一个大的有序单链表,并依次输出合并后的单链表数据。
Input
第一行输入M与N的值;
第二行依次输入M个有序的整数;
第三行依次输入N个有序的整数。
Output
输出合并后的单链表所包含的M+N个有序的整数。
Sample Input
6 5 1 23 26 45 66 99 14 21 28 50 100
Sample Output
1 14 21 23 26 28 45 50 66 99 100
Hint
不得使用数组!
Source
本题是链表的归并,就是将两个链表合并成一个大的链表,一种方法就是建立三个链表,前两个用来储存题目中给的两个链表,第三个用来存放前两个的数据,这种方法比较容易想到,实现起来也比较简单。第三个链表就是比较一下前两个链表每个数据的大小,小的存放进第三个链表。还有一种方法就是仅仅利用两个链表,在输入完数据之后仅对第一个链表进行处理。就是让第二个链表中的每个结点都插入到第一个链表中,让第一个链表成为一个大的链表。但是这种方法在代码的实现过程有点复杂,需要设立至少4个游动指针,有兴趣的朋友可以试一下。这个过程应该会十分有趣的。当然这两种方式都要注意两个链表的长度是不一样的,要注意长的那一个链表的处理。
这里提一下,链表这里如果时间和空间复杂度要求的不是很严格的话,链表的题目有很多都可以利用数组来处理的。不过既然我们正在学习链表就尽量多用链表解决一些问题,这样我们才会变强。
AC代码:
# include<bits/stdc++.h>
using namespace std;
struct node
{
int data;
struct node *next;
}*head1, *head2, *head3;
struct node *creat(int n)//链表建立函数
{
int i;
struct node *t, *p, *head;
head = (struct node*)malloc(sizeof(struct node));
head -> next =NULL; t = head;
for(i = 0; i < n; i++)
{
p = (struct node*)malloc(sizeof(struct node));
scanf("%d", &p->data);p->next = NULL;
t ->next = p;t = p;
}
return head;
};
void show(struct node *head)//链表输出函数
{
head=head->next;
while(head)
{
if(head->next!=NULL)
printf("%d ",head->data);
else
printf("%d\n",head->data);
head=head->next;
}
}
struct node *hebing(struct node*head,struct node *h1,struct node *h2)//链表合并函数
{
struct node *p1,*p2,*tail;
tail=head;
p1=h1->next;
p2=h2->next;
while(p1&&p2)//注意出循环的条件,是两个游动指针都不指向NULL
{
if(p1->data<p2->data)
{
tail->next=p1;
tail=p1;
p1=p1->next;
}
else
{
tail->next=p2;
tail=p2;
p2=p2->next;
}
}
if(p1)//最后长的那个链表的处理,将剩下的结点都放入第三个链表中
tail->next=p1;
else
tail->next=p2;
return head;
}
int main()//主函数
{
head3 = (struct node*)malloc(sizeof(struct node));
int n, m;scanf("%d %d", &n, &m);
head1 = creat(n);head2 = creat(m);
head3=hebing(head3,head2,head1);
show(head3);
return 0;
}
PS:虽然说我基本上都用C++,学C的朋友看到C++代码不要立马就退出认为自己看不懂。C和C++十分相似,有很多人都是学着C++写着C的代码。我写的C和C++代码的区别仅仅在于头文件的不同。之所以比较喜欢写C++是因为C++中有STL标准函数库,如果老师要求的不严格的话其中很多实验题目都可以直接调用STL库中的函数完成,不用自己费尽的写了。我认为的是老师教的思想要会,但是平时也要学习一下函数库的使用,毕竟现在学习的只是一个思想,如果真的想要成为一个程序员是万万不可每个函数都自己写的,累死也写不完。我们现在学习的大多数思想比如栈和队列,二分法查找函数,快排等都有封装好的函数库,每一个编程语言都有自己的函数库,只是里面所包含的函数种类多少的问题。所以在听老师教我们思想的同时我们也应该自己学着“偷懒”,学一些函数库中的函数的用法,这样在不断丰富自己的同时也会使自己更加强大。