已知k个已排序链表头节点指针,将这k个链表合并,合并后仍为有序的 ,返回合并后的头节点
如下三个链表:

合并后的结果如下:

方法一(STL sort算法进行排序):

  1. 先将输入的排序链表插入一个迭代器中,vector数组中国呢
  2. 直接对数组中的链表节点进行按值排序即可

实现算法如下,最终实现源码见文末:

bool cmp(Data *A, Data *B) {return A->data < B->data;
}
Data *merge_list2(vector<Data*> &list) {/*如果传入的链表数组大小为0,则返回空*/if(list.size() == 0) {return NULL;}/*传入的数组大小为1,则返回第一个链表头节点*/if(list.size() == 1) {return list[0];}/*遍历所有的链表,并将每个链表的所有节点插入一个vector中*/vector<Data*> result;for (int i = 0;i < list.size(); ++i) {while(list[i]) {result.push_back(list[i]);list[i] = list[i] -> next;}}/*对vector按照升序排序,其中排序规则可以由cmp函数自定义指定*/sort(result.begin(),result.end(),cmp);return result[0];
}

方法二(分治归并):
使用合并两个有序链表的实现,对所有链表进行两两合并至仅剩下两个,最后合并最后的两个链表,关于合并两个有序链表可以参考C语言的有序单链表合并
这里面的思想就是分而治之,将整体分割为一个个独立的个体分别处理,再进行最后的整合。
算法使用递归方式实现如下,最终实现源码见文末:

Data *merge_list(vector<Data *> &list) {/*如果传入的链表数组大小为0,则返回空*/if(list.size() == 0) {return NULL;}/*传入的数组大小为1,则返回第一个链表头节点*/if (list.size() == 1) {return list[0];}/*将链表分为两部分,分别放入不同的链表结构*/int mid = list.size() / 2;int i;vector <Data *> sub_list1,sub_list2;for (i = 0; i < mid; ++i) {sub_list1.push_back(list[i]);}for (i = mid; i < list.size(); ++i) {sub_list2.push_back(list[i]);}/*分别进行递归处理*/Data *list1 = merge_list(sub_list1);Data *list2 = merge_list(sub_list2);/*将以上两部分处理的最终结果返回,进行两个有序链表的合并*/return merge_two_list(list1,list2);
}

以上两个过程实现代码如下:

#include <iostream>
#include <algorithm>
#include <vector>
#include <stdio.h>using namespace std;typedef struct LinkList {int data;struct LinkList *next;
}Data;
/*打印链表节点数值*/
void print_list(Data *head) {while (head) {printf("%d ",head->data);head = head -> next;}printf("\n");
}
/*尾插法创建链表*/
Data *insert_tail(Data *head, int n) {head = (Data *)malloc(sizeof(Data));head->next = NULL;Data *r = head;while(n--) {Data *p = (Data *)malloc(sizeof(Data));int data;scanf("%d", &data);p->data = data;r->next = p;r = p;p->next = NULL;}return head->next;
}
/*合并两个有序链表算法实现*/
Data *merge_two_list(Data *headA, Data *headB) {Data p;p.data = 0;p.next = NULL;Data *result = &p;while (headA && headB) {if (headA->data < headB->data) {result->next = headA;headA = headA->next;} else {result->next = headB;headB = headB ->next;} result = result -> next;}if (headA == NULL) {result ->next = headB;}    if (headB == NULL) {result ->next = headA;}return p.next;
}
/*分治归并算法实现的链表合并*/
Data *merge_list(vector<Data *> &list) {if(list.size() == 0) {return NULL;}if (list.size() == 1) {return list[0];}int mid = list.size() / 2;int i;vector <Data *> sub_list1,sub_list2;for (i = 0; i < mid; ++i) {sub_list1.push_back(list[i]);}for (i = mid; i < list.size(); ++i) {sub_list2.push_back(list[i]);}Data *list1 = merge_list(sub_list1);Data *list2 = merge_list(sub_list2);return merge_two_list(list1,list2);
}
/*控制排序的规则,当前为升序*/
bool cmp(Data *A, Data *B) {return A->data < B->data;
}
/*排序算法实现链表的链表*/
Data *merge_list2(vector<Data*> &list) {if(list.size() == 0) {return NULL;}if(list.size() == 1) {return list[0];}vector<Data*> result;for (int i = 0;i < list.size(); ++i) {while(list[i]) {result.push_back(list[i]);list[i] = list[i] -> next;}}sort(result.begin(),result.end(),cmp);return result[0];
}int main() {vector<Data*> list;printf("input the num of the construct list \n");int num;scanf("%d",&num);for (int i = 0; i < num; ++i){Data *p;printf("construct the %d list:\n",i+1);list.push_back(insert_tail(p,3)); //尾插法构造三个节点的链表}printf("merget the mulity list with method 1 is \n");Data *result = merge_list(list);print_list(result);printf("merge the mulity list with method 2 is \n");Data *result2 = merge_list2(list);print_list(result2);return 0;
}

最终输出如下

input the num of the construct list
4
construct the 1 list:
1 2 3
construct the 2 list:
3 4 5
construct the 3 list:
4 5 6
construct the 4 list:
6 7 8
merget the mulity list with method 1 is
1 2 3 3 4 4 5 5 6 6 7 8
merget the mulity list with method 2 is
1 2 3 3 4 4 5 5 6 6 7 8

C++的多个有序链表合并相关推荐

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

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

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

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

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

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

  4. 将k个有序链表合并成一个有序链表

    将k个有序链表合并成一个有序链表 这里以从小到大排序为例, 时间复杂度为O(nlgk). 特点:利用最小堆来完成k路归并 思路:取每个列表中的第一个元素,并将其放在最小堆中.与每个元素一起,必须跟踪从 ...

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

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

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

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

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

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

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

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

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

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

  10. 合并两个有序链表,合并后依然有序

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

最新文章

  1. Java后台获取前端传递的日期解析不了
  2. 5G NR RLC:RLC架构和RLC entity
  3. thymeleaf 学习笔记
  4. Matplotlib从文件绘图时Y轴坐标不正确
  5. Python type 函数- Python零基础入门教程
  6. Ping pong【树状数组】
  7. FFmpeg学习(12)——视频转码技巧之二次编码
  8. java numberformat异常_java – 解析货币值失败的NumberFormat
  9. css3静态进度条,CSS3+JS实现静态圆形进度条
  10. 如何显示 word 左侧目录大纲
  11. 零基础写java网络爬虫
  12. 口袋的天空(Kruscal)
  13. 关闭笔记本电脑自带键盘
  14. Android开发入门到实战精通 完整全套开发教程送给你
  15. 学Java需要数学好吗?数学基础差就不能学Java吗?
  16. 【Gym - 100482B Farmer 】 思维
  17. Linux获取系统UUID
  18. 点关于点旋转计算新坐标
  19. windows下将Nginx注册为服务
  20. linux md是什么格式文件,MD_ 文件扩展名: 它是什么以及如何打开它?

热门文章

  1. ueeditor 百度编译器使用onchange效果
  2. java.lang.Thread使用及总结
  3. struct stat结构体的详解和用法
  4. system.out 汉字乱码
  5. usaco Palindromic Squares
  6. ccf Z字形扫描
  7. predicate 列存储索引扫描_在SQL SERVER中导致索引查找变成索引扫描的问题分析
  8. 3d stroke插件下载_推荐一款好用的PS 3D地图插件,PS插件3D Map Generator ,一键生成地图神器...
  9. 计算机的网络端口管理器,Win7设备管理器没有端口选项的三大原因及解决措施...
  10. 樊登高效休息法读书心得_《读懂一本书:樊登读书法 》作者:樊登