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

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

Time Limit: 1000 ms Memory Limit: 65536 KiB

Submit Statistic

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库中的函数完成,不用自己费尽的写了。我认为的是老师教的思想要会,但是平时也要学习一下函数库的使用,毕竟现在学习的只是一个思想,如果真的想要成为一个程序员是万万不可每个函数都自己写的,累死也写不完。我们现在学习的大多数思想比如栈和队列,二分法查找函数,快排等都有封装好的函数库,每一个编程语言都有自己的函数库,只是里面所包含的函数种类多少的问题。所以在听老师教我们思想的同时我们也应该自己学着“偷懒”,学一些函数库中的函数的用法,这样在不断丰富自己的同时也会使自己更加强大。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值