【数据结构之线性表】有序表的合并(链表篇)

news2024/11/20 21:24:58

链表有序表的合并

思路图

将链表L1和L2按照顺序合并到L3中(注:三个链表都是带头结点的)

A、要实现有序合并,必须先比较L1,L2两表中结点的大小,这里我们暂时先不讨论,直接根据图中来进行思路整理,比如这里:L1后面的数比L2后边的数要小,所以我们先将L1后边的数插入到L3中,步骤如下:

其中:

指针q:指向要插入L3中的结点,这里

q=L1->next

指针p3:始终指向L3的最后一个结点,方便后续结点插入

 图中步骤如下:

①删除q指针指向结点前面的指针

L1->next=q->next

②删除q指针指向结点的后一个指针(相当于把q指向的结点给空出来)

q->next=NULL

③直接移动L3头结点的指针,把q所指的结点接在L3后面

p3->next=q

④移动p3,使得p3始终指向L3的最后一个结点,方便后续结点插入

p3=p3->next

A步总代码

 if (L1->next->data < L2->next->data) {
            struct Node *q = L1->next;
            L1->next = q->next;
            q->next = NULL;
            p3->next = q;
            p3 = p3->next;

 

B、接下来L2后面的值比L1后面的值(由于①中指针的移动,现在紧跟着L1的是数值为5的结点了)小,所以要插入L2后面的结点到L3中了,代码同上 

B步总代码

else if (L1->next->data > L2->next->data) {
            struct Node *q = L2->next;
            L2->next = q->next;
            q->next = NULL;
            p3->next = q;
            p3 = p3->next;
        }

C、当我们学会插入操作后,同时不难发现,如果两结点的数值相同,此时我们就可以任意插入一个链表的结点,然后把另一个链表中相同的结点free掉就行(为了确保L1、L2后面紧跟未插入过的结点)

C步总代码

else {
            struct Node *q = L1->next;
            L1->next = q->next;
            q->next = NULL;
            p3->next = q;
            p3 = p3->next;
            free(L2->next);
            L2->next = L2->next->next;//free操作过后记得移动指针位置
        }

D、我们发现,两表长度不一致,当一个链表变为空时,可以直接把另一个链表剩下的直接插入到L3中

D步总代码

if (L1->next == NULL) {
        p3->next = L2->next;
    } else {
        p3->next = L1->next;
    }

总体代码

#include <stdio.h>
#include <stdlib.h>
typedef int ElementType;
struct Node {
    ElementType data;
    struct Node *next;
};

void Sort_head(struct Node *L1, struct Node *L2) {
    struct Node *L3 = NULL;
    L3 = malloc(sizeof(struct Node));
    struct Node *p3 = L3;
    while (L1->next != NULL && L2->next != NULL) {
        if (L1->next->data < L2->next->data) {
            struct Node *q = L1->next;
            L1->next = q->next;
            q->next = NULL;
            p3->next = q;
            p3 = p3->next;
        } else if (L1->next->data > L2->next->data) {
            struct Node *q = L2->next;
            L2->next = q->next;
            q->next = NULL;
            p3->next = q;
            p3 = p3->next;
        } else {
            struct Node *q = L1->next;
            L1->next = q->next;
            q->next = NULL;
            p3->next = q;
            p3 = p3->next;
            free(L2->next);
            L2->next = L2->next->next;
        }
    }
    if (L1->next == NULL) {
        p3->next = L2->next;
    } else {
        p3->next = L1->next;
    }
}

int main() {
    struct Node *L1, *L2;//创建含头结点的空链表 
    L1 = malloc(sizeof(struct Node));
    L2 = malloc(sizeof(struct Node));
    L1->next = NULL;
    L2->next = NULL;

    printf("Enter the elements for list 1: ");
    for (int i = 0; i < 3; i++) {
        struct Node *newNode = malloc(sizeof(struct Node));//为链表1插入入元素 
        scanf("%d", &newNode->data);
        newNode->next = L1->next;
        L1->next = newNode;
    }

    printf("Enter the elements for list 2: ");
    for (int i = 0; i < 3; i++) {
        struct Node *newNode = malloc(sizeof(struct Node));//为链表2插入入元素 
        scanf("%d", &newNode->data);
        newNode->next = L2->next;
        L2->next = newNode;
    }
//完成插入工作后,进行合并 
    Sort_head(L1, L2);
    
	//合并完成后进行遍历输出 
    printf("Merged list: ");
    struct Node *temp = L1->next;
    while (temp != NULL) {
        printf("%d ", temp->data);
        temp = temp->next;
    }

    return 0;
}

注意事项

Sort_head函数中,您需要确保L1L2的头节点不为空,否则可能会导致空指针解引用错误

while (L1->next != NULL && L2->next != NULL) 

这样,我们的合并操作就实现啦~~希望能帮到您Hi~ o(* ̄▽ ̄*)ブ

思考:

如何实现顺序表的合并呢?如果想要知道的话,请关注博主吧~~~主页为您解答! 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2165866.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

pve主要架构和重要服务介绍

Proxmox VE (PVE) 是一款开源的虚拟化平台&#xff0c;它基于 KVM (Kernel-based Virtual Machine) 和 LXC (Linux Containers) 技术&#xff0c;支持虚拟机和容器的运行。PVE 还提供高可用集群管理、软件定义存储、备份和恢复以及网络管理等企业级功能。下面介绍 PVE 的主要架…

jenkins中多个vue项目共用一个node_modules减少服务器内存的占用,对空间造成资源浪费

多个vue项目使用的node_modules一致&#xff0c;每个项目都安装一遍依赖&#xff0c;对空间造成资源浪费。 通过服务器上的软连接mklink(windows服务器&#xff0c;如果是linux服务器用ln)来共用一套node_modules windows mklink /d [链接文件或目录] [原始文件或目录] 进入…

二叉树的基本概念(下)

文章目录 &#x1f34a;自我介绍&#x1f34a;二叉树的分类满二叉树完全二叉树 &#x1f34a;二叉树的存储顺序存储[完全二叉树]链式存储 你的点赞评论就是对博主最大的鼓励 当然喜欢的小伙伴可以&#xff1a;点赞关注评论收藏&#xff08;一键四连&#xff09;哦~ &#x1f34…

无人机避障——4D 毫米波雷达 SLAM篇(一)

做无人机避障相关工作&#xff0c;3D毫米波避障测试顺利后&#xff0c;开始做4D毫米波雷达无人机避障遇到4D雷达点云需要进行处理的问题&#xff0c;查阅文献&#xff0c;发现以下这篇文章中的建图方法应该为后续思考的方向&#xff0c;特此将这个开源项目进行复现和学习&#…

react crash course 2024(2) 创建项目及vscode插件

使用vite创建react项目 npm create vitelatest react-crash-2024 跳到那个项目 cd .\react-crash-2024 打开那个项目 code . 在vite.config.js中设置端口 安装依赖 npm i 运行 npm run dev vs code插件 rafce //在底部导出的react箭头函数组件

计算机毕业设计 基于Python医院预约挂号系统 Django+Vue 前后端分离 附源码 讲解 文档

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…

【AI】深度学习的数学--核心公式

1 梯度下降 f ( x Δ x , y Δ y ) ≃ f ( x , y ) ∂ f ( x , y ) ∂ x Δ x ∂ f ( x , y ) ∂ y Δ y f(x\Delta x,y\Delta y) \simeq f(x,y)\frac{\partial f(x,y)}{\partial x}\Delta x\frac{\partial f(x,y)}{\partial y}\Delta y f(xΔx,yΔy)≃f(x,y)∂x∂f(x,y)​…

聚观早报 | 豆包视频生成大模型发布;华为纯血鸿蒙将开启公测

聚观早报每日整理最值得关注的行业重点事件&#xff0c;帮助大家及时了解最新行业动态&#xff0c;每日读报&#xff0c;就读聚观365资讯简报。 整理丨Cutie 9月25日消息 豆包视频生成大模型发布 华为纯血鸿蒙将开启公测 高德地图将发放百亿补贴 12306上线“车内换座”新…

RK3568笔记六十三:基于LVGL的Linux相机

若该文为原创文章,转载请注明原文出处。 记录移植韦老师的基于LVGL的Linux相机项目,主要是想学习如何在LVGL下显示摄像头数据。 此项目是基于老师的源码框架移植的,地址是lv_100ask_linux_camera: 基于LVGL的Linux相机 (gitee.com) 个人使用的是RK3568,正点原子板子,所以…

CTF-PWN方向自学习笔记

基础知识 栈的结构 熟悉如下寄存器 db 定义的是1Byte的变量 也就是8位 define byte dd 定义的通常是4字节的变量 也就是32位 Define Double Word dw 定义一个16位 也就是2字节的变量 Define Word dq 定义一个8字节 也就是64位的变量 多少位的机器就表示一个字是多少位 x86…

GO网页自动回复机器人源码

源码名称&#xff1a;网页自动回复机器人源码 源码介绍&#xff1a;一款网页自动回复机器人源码&#xff0c;是一款集自动回复、默认消息设置、自定义 API 接口调用于一体的智能网页机器人。它采用高效稳定的 Golang 作为后端开发语言&#xff0c;运行时内存占用极小&#xff…

RNN模型学习

RNN模型 循环神经网络&#xff08;Recurrent Neural Network, RNN&#xff09;是一种用于处理序列数据的神经网络。**RNN具有内部状态&#xff08;或称为记忆&#xff09;&#xff0c;这允许它在处理序列中的每个元素时考虑之前的信息。**这种特性使得RNN非常适合于自然语言处…

【CSS】鼠标 、轮廓线 、 滤镜 、 堆叠层级

cursor 鼠标outline 轮廓线filter 滤镜z-index 堆叠层级 cursor 鼠标 值说明值说明crosshair十字准线s-resize向下改变大小pointer \ hand手形e-resize向右改变大小wait表或沙漏w-resize向左改变大小help问号或气球ne-resize向上右改变大小no-drop无法释放nw-resize向上左改变…

ISA Server配置https踩坑全过程

首先普通的http配置请参考 【ISA Server 2006发布Web网站】 https://www.bilibili.com/video/BV1qc411v75w/?share_sourcecopy_web&vd_sourcef35b2f2d0d34140bcba81b8b6f8c1b69 本文只一笔带过&#xff0c;讲一下https部分。 正解 由于我维护的是windows server 2003的…

付费进群V5版本首发源码

付费进群V5版本首发 最新分站大屏 更新三个模板 仿官方模板等等 最新防注入技术 源码下载&#xff1a;https://download.csdn.net/download/m0_66047725/89797314 更多资源下载&#xff1a;关注我。

Postgresql怎么查询数据库中所有的表,odoo17数据库最依赖表整理

今天遇到了一个需求,需要梳理odoo中数据库表的分类,所以想要知道怎么查询当前数据库中所有的表,特此记录. 一个简单的SQL语句: select * from pg_tables;得到的结果如下: 显然这个有点杂乱,我们换一个SQL语句: select tablename from pg_tables where schemanamepublic不过…

LiveQing视频点播流媒体RTMP推流服务功能-支持电子放大拉框放大直播视频拉框放大录像视频流拉框放大电子放大

LiveQing视频点播流媒体RTMP推流服务功能-支持电子放大拉框放大直播视频拉框放大录像视频流拉框放大电子放大 1、鉴权直播2、视频点播3、RTMP推流视频直播和点播流媒体服务 1、鉴权直播 鉴权直播-》播放 &#xff0c;左键单击可以拉取矩形框&#xff0c;放大选中的范围&#x…

(四)悟说几个特殊矩阵及矩阵函数

上一期介绍了矩阵的出现源于解线性方程组。但是&#xff0c;矩阵出现之后&#xff0c;就犹如打开了潘多拉的盒子&#xff0c;会产生许多魔法。 1 旋转矩阵 我们知道用矩阵左乘某个向量&#xff0c;相当于对该向量做线性变换。那么是否有一种矩阵&#xff0c;能让向量旋转&…

前端项目代理到本地调试

我们在项目开发中&#xff0c;有时mock数据不能满足我们的需求&#xff0c;可以考虑把线上地址运行在本地代码上进行开发调试&#xff0c;也就是所谓的代理 这里推荐使用的工具是 whistle SwitchyOmega 1. 首先在chrome浏览器中安装插件SwitchyOmega 下载地址 CrxDL - 下载…

Git - 初识版本库

版本库也叫仓库&#xff0c;英文名 repository。 ‍ 创建版本库 之前我们说了版本库的概念&#xff1a; 存储版本的地方&#xff08;存放各个版本之间差异的地方&#xff09;&#xff0c;通常称为版本库。通常版本库是以文件&#xff08;夹&#xff09;的形式存放在磁盘上&a…