合并两个有序链表合并之后还是有序的,首先这两个链表是需要是有序的,也就是说这两个链表已经排好序了,才能进行合并。但是昨天也写过冒泡排序的程序了,如果让你合并两个不是有序的链表合并之后有序,那可以先将两个链表进行冒泡排序再进行合并就可以了。

首先明确思路,合并两个链表有两种方式,第一种就是创建一个新的链表,不断的将原来两个链表的数据接入新的链表,但是还有另外一种方式就是在原来两个链表上进行操作,将其中一个链表的数据不断的和另一个链表的数据进行比较,如果第一个链表的数据比第二个大的话那就将第二个链表的数据放在第一个链表当前数据的前边,今天我所写的代码是第一种的方式,第一种相对来说容易理解,并且容易操作。

SListNode* SListMerge(SListNode* list1, SListNode* list2){SListNode *New=BuySListNode(0);SListNode*head=New;while (list1&&list2 ){if ((list1->_data) < (list2->_data)){SListPushBack(&New,list1->_data );list1 = list1->_next;}else{SListPushBack(&New, list2->_data);list2 = list2->_next;}}if (list1 == NULL){while (list2){SListPushBack(&New, list2->_data);list2 = list2->_next;}}if (list2 == NULL){while (list1){SListPushBack(&New, list1->_data);list1 = list1->_next;}}return head;}

先看一下代码。上来首先判断是不是会有传入的两个链表为空的情况。

while (list1&&list2 )

{

if ((list1->_data) < (list2->_data))

{

SListPushBack(&New,list1->_data );

list1 = list1->_next;

}

else

{

SListPushBack(&New, list2->_data);

list2 = list2->_next;

}

}

之后进入while循环如果有一个链表为空的话就需要结束循环,进入循环之后两个节点的数据进行比较,将其中小的那个的数据通过尾插函数将数据插入新的链表中,之后传入数据的那个链表的指针就需要向后移动一个。

if (list1 == NULL)

{

while (list2)

{

SListPushBack(&New, list2->_data);

list2 = list2->_next;

}

}

if (list2 == NULL)

{

while (list1)

{

SListPushBack(&New, list1->_data);

list1 = list1->_next;

}

}

如果跳出while循环,不排除会存在其中一个为空,但是另一个还没走到链表最后的情况,所以需要将非空的那一个链表剩下的数据再次通过尾插插入新的链表中。

之后 返回新链表的头指针,就可以了。

void SListPushBack(SListNode** ppHead, DataType x){SListNode *cur = NULL;SListNode *NewNode;cur = *ppHead;NewNode = BuySListNode(x);if (*ppHead == NULL){*ppHead = NewNode;(*ppHead)->_next = NULL;}else{while (cur->_next){cur = cur->_next;}cur->_next = NewNode;NewNode->_next = NULL;}}
SListNode* BuySListNode(DataType x){SListNode *NewNode;NewNode = (SListNode*)malloc(sizeof(SListNode));if (NewNode == NULL){printf("空间分配失败\n");}else{NewNode->_data = x;NewNode->_next = NULL;}return NewNode;}

这两个分别是尾插函数和分配空间的函数。

合并两个有序链表,合并后依然有序相关推荐

  1. 将两个有序链表合并成一个链表

    代码实现功能如下:将两个有序链表合并成一个有序链表. 具体思路如下:首先自己调用链表的创建函数,手动创建两个有序链表,链表的创建以输入0作为截止标志.创建好两个有序链表之后,将两个链表的头结点进行比较 ...

  2. 将两个有序链表合并为一个链表任然有序C语言

    将两个有序链表合并为一个链表任然有序,两个链表都是从大到小或者从小到大. 方法: 1.将两个链表连起来,对所有元素进行排序. 2.因为两个链表的长度可能不同,则将两链表相同长度的一部分进行排序,将较长 ...

  3. 链表面试题3:将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成 的。

    链表面试题3:将两个有序链表合并为一个新的有序链表并返回.新链表是通过拼接给定的两个链表的所有节点组成 的. 首先我们的思想是将得一个链表和第二个链表的每个结点进行比较,谁小谁就插入到新链表的最后. ...

  4. 【数据结构笔记】将两个递增的有序链表合并为一个递增的有序链表

    将两个递增的有序链表合并为一个递增的有序链表.要求结果链表仍使用原来两个链表的存储空间, 不另外占用其它的存储空间.表中不允许有重复的数据. [题目分析] 合并后的新表用头指针Lc指向,pa和pb分别 ...

  5. 两个有序链表合并成一个有序的单链表

    将这两个有序链表合并成一个有序的单链表 要求结果链表仍使用原来两个链表的存储空间,不另外占用其它的存储空间 表中允许有重复数据 算法描述 (1)定义一个合并后的指针pc指向La表的头结点.由于要求不占 ...

  6. c++实现两有序链表合并成一个新的有序链表

    包括定义的链表,插入数据,及输出打印 #include <iostream> #include <vector> #include <numeric> #inclu ...

  7. Coding:两个从大到小的有序链表合并成一个从小到大有序链表

    要求 请实现一个函数,把两个从大到小的有序链表合并成一个链表,新的链表是一个从小到大的有序链表. struct list {int value;list* next; }; list * merge ...

  8. Java实现两个递增有序链表合并成一个递增有序链表和两个非递减有序链表合成一个非递增有序链表

    代码如下: package sjjgniub;import java.util.LinkedList; import java.util.Scanner;@SuppressWarnings(" ...

  9. 题目17 合并两个排序链表

    / // 7. 题目17 合并两个排序链表 //时间复杂度:O(n), 空间复杂度:O(1) ListNode<int>* MergeSortedLists(ListNode<int ...

最新文章

  1. 一款比较实用齐全的jQuery 表单验证插件
  2. 如何使用 Python 构建推荐引擎?
  3. Python 基于Python从mysql表读取千万数据实践
  4. 【LINUX】——linux如何使用Python创建一个web服务
  5. Matlab安装有限元FEM工具箱
  6. PDF文件加密有什么方法?如何给PDF文件加密
  7. java 引用队列_Java中的方法队列
  8. 【原创】关于ASP.NET WebForm与ASP.NET MVC的比较
  9. ibatis和hibernate
  10. String类中的常用方法
  11. 这本Python算法书有点火~
  12. 基本类型-字符、字符串、文本
  13. iOS常用宏定义总结 --Objective-C
  14. 基于Ubuntu的linux环境制作嵌入式SD/TF启动卡
  15. 计算机上怎么计算x的n次方,计算x的n次方
  16. 小米五怎么设置锁屏显示无服务器,小米手机怎么设置锁屏状态下不能关机 - 卡饭网...
  17. 交换机路由器命令大全
  18. 计算机应用开班培训简报,信息技术提升培训简报及总结.doc
  19. Java-对象转型(casting)
  20. make xconfig详解

热门文章

  1. 7.BLE---跳频原理
  2. Quartus2入门的一个波形仿真的实例教程
  3. CnOpenData中国高校专利申请数量统计数据
  4. signature=1be7575a614ba3597c2c53247a739d1c,paraphrase答案(校对版lesson1-lesson6)
  5. 智慧物流之电子标签在RFID仓库管理系统中的应用-RFID仓库智能盘点
  6. K8S中service与controller(控制器)通过标签选择器(selector)匹配pod
  7. iTop4412开发板Android4.0.3镜像OTG方式烧写
  8. excel合并多工作簿同名工作表?
  9. 三轴加速度计的原理和方法
  10. 下面为子代选择器结合符的是_奥鹏2014秋福建师范大学《语言学概论》在线作业一答案...