将这两个有序链表合并成一个有序的单链表
要求结果链表仍使用原来两个链表的存储空间,不另外占用其它的存储空间
表中允许有重复数据

算法描述

(1)定义一个合并后的指针pc指向La表的头结点。由于要求不占用新的存储空间,所有用La的头结点当做新表的的头结点。
(2)依次从La和Lb表中取出最小的的元素,然后将其链接到新表后,直到其中一个表为空。
(3)最后,将La或Lb中剩余的元素链接到新表后即可。

算法分析

时间复杂度:O(La.length+Lb.length)
空间复杂度:O(0)

代码实现

/*合并两个链表*/
int MergeList_L(LinkList &La,LinkList &Lb) {LinkList pa = La->next;LinkList pb = Lb->next;LinkList pc = La;  //用使用La的头结点 作为合成后的头结点 while(pa&&pb){if(pa->data<=pb->data){pc->next = pa;pc = pa;  //将pc指针指向新链表的最后一个结点 pa = pa->next;}else{pc->next = pb;pc = pb;  //将pc指针指向新链表的最后一个结点 pb = pb->next;}} pc->next = pa?pa:pb;free(Lb);return 0;
}

完整代码

#include <stdio.h>
#include <stdlib.h>
//定义一个链表的结点(元素)
typedef struct LNode{int data;//数据域struct LNode *next;//指向自己类型的指针域
}LNode,*LinkList;//LinkList 为LNode类型的指针 /*初始化操作*/
int InitList_L(LinkList &L) {L=(LinkList)malloc(sizeof(LNode));//生成一个LNode类型的 头 结点 L->next=NULL;return 0;
}/*获取链表的长度 */
int GetListLength_L(LinkList L){LinkList p = L->next; int j = 0;while(p){p = p->next;j++;}return j;
}/*头插法创建链表*/
int CreateListHead_L(LinkList &L,int n){for(int i=n;i>0;i--){LinkList newNode = (LinkList)malloc(sizeof(LNode));//生成新的结点 printf("请输入第 %d 个的元素:",n-i+1);scanf("%d",&newNode->data);//将输入的值赋给新创建结点的data域 newNode->next = L->next;//将新生成的结点指向头结点的下一个结点 L->next = newNode;//将头结点指向新生成的结点 }return 0;
} /*尾插法创建链表*/
int CreateListRear_L(LinkList &L,int n){LinkList r=L;//尾指针指向此链表for(int i=0;i<n;i++){LinkList newNode = (LinkList)malloc(sizeof(LNode));//生成新的结点 printf("请输入第 %d 个的元素:",i+1);scanf("%d",&newNode->data);newNode->next = r->next;//将新生成的结点指向头结点的下一个结点 r->next = newNode;//将新生成的结点指向头结点的下一个结点 r = newNode;//将尾指针指向新生成的结点,新结点每次都插入到最后 }return 0;
}
/*取值(获取链表指定位置的数据) */
int GetElem_L(LinkList L,int i){int j=0;LinkList p=L->next;while(p&&j<i-1){p = p->next;j++;}return p->data;
}
/*打印链表中的元素*/
int PrintList_L(LinkList L) {LinkList p = L->next;while(p){printf("%d ",p->data);p = p->next;}printf("\n");return 0;
}
/*合并两个链表*/
int MergeList_L(LinkList &La,LinkList &Lb) {LinkList pa = La->next;LinkList pb = Lb->next;LinkList pc = La;  //用使用La的头结点 作为合成后的头结点 while(pa&&pb){if(pa->data<=pb->data){pc->next = pa;pc = pa;  //将pc指针指向新链表的最后一个结点 pa = pa->next;}else{pc->next = pb;pc = pb;  //将pc指针指向新链表的最后一个结点 pb = pb->next;}} pc->next = pa?pa:pb;free(Lb);return 0;
}
main(){LinkList La,Lb;//初始化int aInitStatus;//La初始化状态 int bInitStatus;//Lb初始化状态 int isEmpty;//是否为空 int headInsertStatus;//头插法插入状态 int rearInsertStatus;//删除状态 int listLength;//链表长度 int num;//插入元素的个数 aInitStatus = InitList_L(La);bInitStatus = InitList_L(Lb);if(bInitStatus==0&&aInitStatus==0){printf("初始化成功!copyright@www.it1997.com\n");} else{printf("初始化失败!\n");} /*尾插法*/ printf("【尾插法】\n");/*创建链表La*/ printf("请输入创建链表La元素的个数:"); scanf("%d",&num);rearInsertStatus = CreateListRear_L(La,num);if(rearInsertStatus==0){printf("尾插法插入成功!copyright@www.it1997.com\n");} else{printf("尾插法插入失败!copyright@www.it1997.com\n");} printf("======华丽分割线======\n"); printf("链表La为:"); PrintList_L(La);/*创建链表Lb*/ printf("请输入创建链表Lb元素的个数:"); scanf("%d",&num);rearInsertStatus = CreateListRear_L(Lb,num);if(rearInsertStatus==0){printf("尾插法插入成功!copyright@www.it1997.com\n");} else{printf("尾插法插入失败!copyright@www.it1997.com\n");} printf("======华丽分割线======\n"); printf("链表Lb为:"); PrintList_L(Lb);printf("======华丽分割线======\n"); MergeList_L(La,Lb);printf("合并后链表为:"); PrintList_L(La);}

两个有序链表合并成一个有序的单链表相关推荐

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

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

  2. 将两个有序数组合并成一个有序数组

    将两个有序数组按从小到大顺序合并成一个数组. #include<iostream> using namespace std; int main() {int a[5]={1,5,6,8,9 ...

  3. c语言合并两个单链表LA和LB,把两个递增的单链表La,Lb,合并成一个递减的单链表Lc...

    原文题是严蔚敏同志的数据结构习题中第二章线性表中提出的问题. 原问如下: 2.24 假设有两个按元素值递增有序排列的线性表A和B,均以单链表作存储结构,请编写算法将A表与B表归并成一个按元素值递减有序 ...

  4. 链表归并成递减c语言,将两个递增的单链表合并为一个递减的单链表

    问题描述: 假设有两个按元素值递增次序排列的线性表,均以单链表形式存储.请编写算法将这两个单链表归并为一个按元素值递减次序排列的单链表,并要求利用原来两个单链表的结点存放归并后的单链表. 问题解答: ...

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

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

  6. 两个有序顺序表合并成一个有序顺序表

    一 概述 将两个有序顺序表合并为一个新的有序表,并由函数返回结果顺序表.实际过程中应该不断取下两个顺序表表头较小的结点存在新的顺序表中,然后,将其中某个表中的剩余数据直接加到新的顺序表后面. 二 代码 ...

  7. 两个无序单链表,排序后合并成一个有序链表

    两个无序单链表,排序后合并成一个有序链表 算法思想:用冒泡法,对链表1和2进行排序,对排序后的两个链表,从小到大进行循环,装入链表3中. #include<stdio.h> #includ ...

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

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

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

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

最新文章

  1. malloc()与calloc区别【转】
  2. redis 主从复制功能 原理
  3. 从左边列表复制到右边列表html,JQ实现左侧列表内容移动至右侧列表出现的问题...
  4. 屏蔽Crash 提示框的两种方式
  5. DataWorks功能实践速览
  6. InnoDB锁机制之Gap Lock、Next-Key Lock、Record Lock解析
  7. 基于stm32简易计算机电路图,基于STM32的简易电子计算器设计与实现(DOC).doc
  8. JTA的含义及应用简介
  9. python路线图_Python路线图
  10. Cocos Creator 配合Tiled地图的使用
  11. 充电宝哪个品牌的更实用更安全?安全的充电宝推荐
  12. 洛谷P1478 陶陶摘苹果(升级版)视频题解
  13. 开源阅读书源_开源阅读畅读全网图书 有声读物
  14. 计算机协会发言稿范文,计算机协会社长就职演讲稿范文
  15. BJFU 1399 警察抓小偷
  16. 计算广告及搜索广告简介
  17. SiO2 酰肼修饰单分散二氧化硅微球/胺基修饰二氧化硅改性环氧树脂胶粘剂/硅烷修饰二氧化硅微球/3-氨丙基三乙氧基硅烷(APTS)修饰的二氧化硅
  18. 怎样才算压倒性投入?
  19. 免费沙箱软件模拟支付_沙箱模拟公众号支付的问题
  20. 大学计算机应用基础课本80页,《大学计算机应用基础》黄求根、卢强华 编_孔网...

热门文章

  1. 【Java】我的世界Java版外挂制作 [1] - 模块管理器与第一个模块
  2. Java里氏转换_里氏代换原则、依赖倒转原则 | 学步园
  3. FPGA未来硬件架构探讨-NoC
  4. GBase XDM 数据库ldapdelete命令讲解和示例分析
  5. 人类算力天花板?1750 亿参数的 AI 模型 GPT-3 引爆硅谷
  6. Vue的video-player的视频无法加载出来,vue视频插件;显示叉号; The media could not be Loaded,
  7. 手把手教你搭建jME2(jMonkeyEngine2)环境【有图有真相】
  8. linux点亮硬盘locat,Linux中常用的查询指令(which、whereis、find、locatae)
  9. 开门的磁卡在哪里配_门禁卡能配吗?
  10. MTK平台替换签名key方法