合并两个排序的单链表

合并两个排序的单链表

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

【题目】

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


【分析】

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

这里写图片描写叙述


【測试代码】

#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");

}

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

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 服务器可以ghost备份吗_服务器可以用dism备份吗

    服务器可以ghost备份吗_服务器可以用dism备份吗带RAID服务器能GHOST备份吗?一、不可以的原因:1、从saymantec上查询到不行:Ghost与RAID的兼容性情形本文介绍Ghost与使用RAID的计算机的兼容性。解释请注意:无论驱动器使用软件级RAID还是硬件级RAID,赛门铁克都不提供制作RAID驱动器映像的技术支持。能否成功制作RAID驱动器映像取决于特定的计算机模型、驱动程序控制器、硬盘驱动器和…

  • 51单片机汇编教程[通俗易懂]

    51单片机汇编教程[通俗易懂]  很多电子爱好者,都想学习单片机这门技术。下面的这一系列教程是www.51hei.com专门为初学者入门而准备的,从底层硬件入手基于汇编和c两种语言,详细的介绍了单片机的原理,指令,寄存器,以及接口等,后面还为你准备了一些小的设计。都是从单片机最基本的东西讲起,相信你一定能看懂,并且学会单片机这门有意思的技术,有什么问题可在文章后面的评论留言。  第1课:单片机简叙第2课:单片…

  • usb转485驱动

    usb转485驱动usb转485驱动是官方提供的一款USB驱动,本站收集提供高速下载,用于解决USB接口不能正常识别,无法正常使用的问题,本动适用于:WindowsXP/Windows7/Windows8/Windows1032/64位操作系统。有需要的朋友可以来本站下载安装。usb转485驱动http://www.equdong.net/qtrj/usbdrv/16155.html…

  • python全国计算机二级报名_python有证书考吗

    python全国计算机二级报名_python有证书考吗第一次参加全国计算机等级考试的考生对于网上报名的流程,对全国计算机考试流程中某些环节并不清楚,小编今天就整理下全国计算机等级考试流程及详细说明,提供网上报名流程示意图,解决大家在全国计算机等级考试报名过程中的疑问。(如有出入,请以官方信息为准)考生需登录各地计算机等级考试官方报名网站,进入“全国计算机等级考试报名系统”进行注册登录。(一)注册账号和登录一、注册ETEST通行证1.考生首次登录系…

  • 台式机通过网线连接笔记本的wifi网络

    台式机通过网线连接笔记本的wifi网络由于在实验室的场地要求,不容易拉网线进行学习,也就开始研究利用网线连接笔记本来使台式机连接上网络。【台式机:Ubuntu18.04+笔记本:Windows10】首先,Ubuntu系统的网络设置不变【IPV4,IPV6都是自动的】其次开始设置Windows10的网络(设置不好容易导致笔记本也上不了网哦)1.右击我们的图标,进入网络和Internet设置。2.进入网络和共享中心3.点击笔记本的WLAN网络(这个时候默认你已经插上了网线,而且进入的这个过程可以通过控制面板进入)4.这个时候

  • bigdecimal保留最多小数位_bigdecimal四舍五入保留两位小数

    bigdecimal保留最多小数位_bigdecimal四舍五入保留两位小数整理……//1&gt;0.00或者#.00格式:小数点后两位,不足用0补足。DecimalFormatdf1=newDecimalFormat("#.00");System.out.println(df1.format(2.2));//2.20System.out.println(df1.format(2.246));//2.25//2&gt;#.#…

发表回复

您的电子邮箱地址不会被公开。

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