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

链表有序表的合并

思路图

将链表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.rhkb.cn/news/432021.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

plt常用函数介绍二

目录 fig.add_subplot()ax.set()plt.legend()plt.subplots_adjust()plt.suptitle()plt.grid() fig.add_subplot() fig.add_subplot() 是 Matplotlib 中 Figure 对象的方法&#xff0c;用于在图形中添加子图&#xff08;subplot&#xff09;。 其语法为&#xff1a; subplot(…

linux网络编程8

24.9.25学习目录 一.原始套接字&#xff08;续&#xff09;1.sendto发送数据原始套接字1.ARP 二.Web编程1.概述2.HTML 一.原始套接字&#xff08;续&#xff09; 混杂模式&#xff1a; 指一台机器的网卡能够接受所有经过它的数据包&#xff0c;不论其目的地址是否是它&#xf…

程序人生:软件测试 非技术性面试题【建议每个测试人观看】

1、自我介绍&#xff1a;三分钟左右 2、为什么从郑州/太原离职&#xff1f; 3、你的职业规划是什么样的&#xff1f; 4、对下一家公司有什么自己的想法吗&#xff1f; 5、你觉得作为一名测试工程师&#xff0c;应该具备什么样的素养&#xff1f; 6、你觉得管理层&#xff…

echart实现渐变色-vue2

let selectData5 [{name: "有功电量",type: "bar",data: data.data.historyKwhList,unit: "MW",itemStyle: {// 使用渐变色color: {type: "linear",x: 0,y: 0,x2: 0,y2: 1,colorStops: [{offset: 0,color: "#04C886",},{of…

市面第一款 C++ 版本的U盘装机软件(即将上线)

市面大部分U盘装机软件&#xff0c;都是采用Au3脚本开发&#xff0c;而且有各种捆绑&#xff0c;闲来无聊&#xff0c;采用Qt C制作一款CU盘装机软件&#xff0c;从此告别Au3脚本&#xff0c;各种炫酷界面随便换&#xff0c;敬请期待 另外两个界面暂时不公布&#xff0c;防止Au…

C/C++语言基础--C++类数据、静态与非静态、常成员、友员、成员变量与函数指针等相关知识点

本专栏目的 更新C/C的基础语法&#xff0c;包括C的一些新特性 前言 通过前面几节&#xff0c;我们介绍了C的类与对象、构造与析构函数、拷贝等相关知识&#xff0c;这一篇将详细介绍了C的成员变量相关的知识点与扩展C语言后面也会继续更新知识点&#xff0c;如内联汇编&#…

Python | Leetcode Python题解之第423题从英文中重建数字

题目&#xff1a; 题解&#xff1a; class Solution:def originalDigits(self, s: str) -> str:c Counter(s)cnt [0] * 10cnt[0] c["z"]cnt[2] c["w"]cnt[4] c["u"]cnt[6] c["x"]cnt[8] c["g"]cnt[3] c["h…

初探shell与bash使用指南

文章目录 一、shell二、bash第一步、新建脚本第二步、添加权限第三步、执行bash脚本 在日常开发中&#xff0c;经常使用到Linux服务器相关知识&#xff0c;输入命令获取想要的结果&#xff0c;本篇介绍shell 与 bash的相关知识。 一、shell 是命令行解释器&#xff0c;接收用户…

C盘空间不足--WizTree(管理空间)

WizTree&#xff1a;高效的磁盘空间分析工具 在日常使用电脑的过程中&#xff0c;磁盘空间的管理常常成为一个棘手的问题。随着文件的不断增加&#xff0c;我们的硬盘空间逐渐被占满&#xff0c;而这些文件中有很多其实并不重要。为了帮助用户更好地管理磁盘空间&#xff0c;Wi…

【AI学习】Lilian Weng:What are Diffusion Models?

读OpenAI 的 Lilian Weng博客《What are Diffusion Models?》 文章链接:https://lilianweng.github.io/posts/2021-07-11-diffusion-models/ 通过浏览器的在线翻译&#xff0c;直接截图了。翻译的有些问题&#xff0c;但是基本能大概看明白了。 我只是个人的记录&#xff0c;…

Redis的三种持久化方法详解

Redis持久化机制详解 | JavaGuide Redis 不同于 Memcached 的很重要一点就是&#xff0c;Redis 支持持久化&#xff0c;而且支持 3 种持久化方式: 快照&#xff08;snapshotting&#xff0c;RDB&#xff09;只追加文件&#xff08;append-only file, AOF&#xff09;RDB 和 A…

本地生活商城开发搭建 同城O2O线上线下推广

同城本地化商城目前如火如荼&#xff0c;不少朋友咨询本地生活同城平台怎么开发&#xff0c;今天商淘云与大家分享同城O2O线上商城的设计和开发。 本地生活商城一般会涉及到区域以及频道类&#xff0c;一般下单需要支持用户定位、商家定位&#xff0c;这样利于用户可以快速找到…

51单片机快速入门之按键应用拓展

51单片机快速入门之按键应用拓展 LED的点动控制: 循环检测,当key 为0 时 led 亮 反之为熄灭 while(1){ if(key!1) { led0; }else { led1; } } LED的锁定控制: 当按钮按下,led取反值 while(1) { if(key!1) { led!led; } } LED的4路抢答控制: bz默认为0 !bz 取反值,循环启动…

C++系列-模版

&#x1f308;个人主页&#xff1a;羽晨同学 &#x1f4ab;个人格言:“成为自己未来的主人~” 非类型模版参数 模板参数分类型模板参数与非类型模板参数 类型形参即&#xff1a;出现在模板参数列表&#xff0c;跟在class或者typename之类的参数类型名称 非类型形参即&am…

SpringBoot 数据库表结构文档生成

官方地址&#xff1a;https://github.com/pingfangushi/screw screw 螺丝钉&#xff0c;支持以下数据库 MySQL MariaDB TIDB Oracle SqlServer PostgreSQL Cache DB&#xff08;2016&#xff09; 生产文档支持 html word markdown 开始 添加依赖 <!-- 螺丝钉 --><…

软件测试技术之 GPU 单元测试是什么!

1 背景 测试是开发的一个非常重要的方面&#xff0c;可以在很大程度上决定一个应用程序的命运。良好的测试可以在早期捕获导致应用程序崩溃的问题&#xff0c;但较差的测试往往总是导致故障和停机。 单元测试用于测试各个代码组件&#xff0c;并确保代码按照预期的方式工作。单…

三维重建的几何评价指标

1.三维重建的几何评价指标 1.1 Chamfer Distance Geometry quality (1) Chamfer Distance&#xff08;CD&#xff09; CD衡量两组点云之间的几何差异&#xff0c;距离越小越好。 CD是一种用于衡量两个点云之间相似度的常用几何评价指标。它计算一个点云中每个点到另一个点云的…

seL4 Threads(四)

官网链接: Threads Threads 这篇教程主要是使用seL4中的threads。 TCB Thread Control Blocks seL4提供了线程代表执行的上下文以及管理处理器时间。seL4中的线程是通过线程控制块对象&#xff08;TCB&#xff09;实现的&#xff0c;每个内核线程都有一个线程控制块。 线程…

Web3技术在元宇宙中的应用:从区块链到智能合约

随着元宇宙的兴起&#xff0c;Web3技术正逐渐成为其基础&#xff0c;推动着数字空间的重塑。元宇宙不仅是一个虚拟世界&#xff0c;它还代表着一个由去中心化技术驱动的新生态系统。在这个系统中&#xff0c;区块链和智能合约发挥着至关重要的作用&#xff0c;为用户提供安全、…

Vue | watch监听

Vue | watch监听 在Vue.js的世界里&#xff0c;watch监听器是一个强大且灵活的工具&#xff0c;它允许我们在数据变化时执行特定的逻辑。本文将深入探讨watch的出现背景、使用方法、应用场景、源码原理以及扩展技巧&#xff0c;旨在帮助读者全面掌握这一重要特性。 文章目录 Vu…