合并两个排序的单链表

合并两个排序的单链表

大家好,又见面了,我是全栈君。

【题目】

输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是依照递增排序的。


【分析】

合并单链表,须要找到头结点,对照两个链表头结点后,确定头结点,再确定头结点下一个结点,循环递归的如前面一样操作确定每一个结点位置,同一时候考虑边界条件,假设两个链表为空。则肯定无需合并了,就是空链表,假设一个链表为空,还有一个不为空,则返回不为空的链表。详细分析流程能够看以下的样例:

这里写图片描写叙述


【測试代码】

#include<stdio.h>
#include<stdlib.h>
#include<stack>

typedef int data_type;

typedef struct Node node_t;// 给struct Node取个别名node_t
typedef struct Node * node_ptr;//给struct Node*取个别名node_ptr

typedef struct Node
{
    data_type data;
    struct Node *node_next;//node_next是一个指向结构的指针,告诉指针要指向的地址就要付给它一个结构类型地址
};

//链表初始化
node_t * init()
{
    node_ptr p;
    p = (node_t *)malloc(sizeof(node_t));
    p->node_next = NULL;
    return p;
}
//在链表后面插入结点
node_t *insert_back(node_ptr p , data_type data)
{


    node_ptr pnew = (node_t *)malloc(sizeof(node_t));
    pnew ->node_next = NULL;
    pnew ->data = data;

    p->node_next = pnew;

    return pnew;
}


node_t * merge(node_ptr list1_head, node_ptr list2_head)
{
    if(list1_head == NULL)
        return list2_head;
    else if(list2_head == NULL)
        return list1_head;
    node_ptr merge_head = NULL;
    if(list1_head ->data < list2_head->data)
    {
        merge_head = list1_head;
        merge_head->node_next  = merge(list1_head->node_next,list2_head);
    }
    else
    {
        merge_head = list2_head;
        merge_head->node_next = merge(list1_head, list2_head->node_next);
    }

    return merge_head;
}

//正常打印
void print(node_ptr p)
{
    if(!p)
    {
            printf("no data, you think too much");
            return ;
    }
    node_ptr list = p;
    while(list->node_next != NULL)
    {
        printf("%d ", list->data);
        list = list->node_next;
    }
    printf("%d ",list->data);
    printf("\n");

}



void main()
{
    node_ptr pnode1,pnode2, list1,list2;
    pnode1 = init();
    pnode2 = init();

    list1 = pnode1;
    list2 = pnode2;

    pnode1 = insert_back(pnode1, 1);
    pnode1 = insert_back(pnode1, 3);
    pnode1 = insert_back(pnode1, 5);

    pnode2  = insert_back(pnode2 , 2);
    pnode2  = insert_back(pnode2 , 4);
    pnode2  = insert_back(pnode2 , 6);

    printf("单链表1为:");
    print(list1->node_next);
    printf("其头结点元素为:%d\n", list1->node_next->data);
    printf("单链表2为:");
    print(list2->node_next);
    printf("其头结点元素为:%d\n", list2->node_next->data);
    printf("\n");

    node_t *merge_list = merge(list1->node_next, list2->node_next);
    printf("合并单链表顺序为:");
    print(merge_list);
    printf("头结点元素为:%d\n",merge_list->data);
    printf("\n");

}

【输出】
这里写图片描写叙述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/115853.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • agrs php zf2_AGRS币是什么东西,投资理财区块链数字货币

    agrs php zf2_AGRS币是什么东西,投资理财区块链数字货币AGRS币是什么东西,投资理财区块链数字货币如何高回报投zi数字货币,最后一波10~100倍财富回报盛宴,错过了就不再有!大家好,七年虚拟货币玩家,大牛谈不上,但是也带着上万名学生做了几年投zi了,没错过比特币,没错过以太坊,没错过AGRS币,回报在1000倍左右了从2013年年前开始带学生投zi区块链,学生的平均回报也在200倍左;欢迎大家来一起交流,互相学习!如何在AGRS币牛市和熊市的切换中…

    2022年5月30日
    33
  • vod_cache_data是什么?

    vod_cache_data是什么?这个其实是迅雷看看的缓存文件夹,并不是病毒。迅雷相对于flashget来说,速度非常快。主要是因为迅雷的p2sp技术,但是这个也通常被人们认为是盗链技术。anyway,如果只是用“不管白猫

    2022年7月2日
    25
  • MATLAB画图——基础篇「建议收藏」

    MATLAB画图——基础篇「建议收藏」MATLAB画图——基础篇在MATLAB使用的过程中,学会画图是一项必要的技能。在这里,我总结了部分简单的画图函数,同时附上代码(本文中的程序为了方便给出的数据都很简单,大家可以自己去尝试其他数据)。这对刚刚开始接触MATLAB的小白来说,我认为还是很有帮助的。文章目录一、plot()函数1.二维图形(1)绘图选项(2)图形的辅助标注和窗口的分割(3)格式2.三维图形(1)格式(2)网格矩阵生成函数:meshgrid(3)mesh函数(4)surf函数二、特殊图形1.对数坐标图2.极坐标图3.条形图一

    2026年2月2日
    5
  • 查看文件句柄数 linux_linux文件句柄数量怎么看

    查看文件句柄数 linux_linux文件句柄数量怎么看查看系统的最大文件句柄数和文件句柄的使用者PIDulimit-n查看当前系统的最大句柄数显示如下ulimit-HSnx设置当前系统的文件句柄数为x以上命令中,H指定了硬性大小,S指定了软性大小,n表示设定单个进程最大的打开文件句柄数量。个人觉得最好不要超过4096,毕竟打开的文件句柄数越多响应时间肯定会越慢。设定句柄数量后,系统重启后,又会恢复默认值。如果想永久保存下来,可以修…

    2022年10月17日
    2
  • PHP过滤指定字符串,过滤危险字符

    PHP过滤指定字符串,过滤危险字符

    2021年9月24日
    44

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号