当前位置:   article > 正文

两个有序链表合并成一个有序的单链表_将两个有序链表合并成一个有序链表

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

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

算法描述

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

算法分析

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

代码实现

  1. /*合并两个链表*/
  2. int MergeList_L(LinkList &La,LinkList &Lb) {
  3. LinkList pa = La->next;
  4. LinkList pb = Lb->next;
  5. LinkList pc = La; //用使用La的头结点 作为合成后的头结点
  6. while(pa&&pb){
  7. if(pa->data<=pb->data){
  8. pc->next = pa;
  9. pc = pa; //将pc指针指向新链表的最后一个结点
  10. pa = pa->next;
  11. }else{
  12. pc->next = pb;
  13. pc = pb; //将pc指针指向新链表的最后一个结点
  14. pb = pb->next;
  15. }
  16. }
  17. pc->next = pa?pa:pb;
  18. free(Lb);
  19. return 0;
  20. }

完整代码

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. //定义一个链表的结点(元素)
  4. typedef struct LNode{
  5. int data;//数据域
  6. struct LNode *next;//指向自己类型的指针域
  7. }LNode,*LinkList;//LinkList 为LNode类型的指针
  8. /*初始化操作*/
  9. int InitList_L(LinkList &L) {
  10. L=(LinkList)malloc(sizeof(LNode));//生成一个LNode类型的 头 结点
  11. L->next=NULL;
  12. return 0;
  13. }
  14. /*获取链表的长度 */
  15. int GetListLength_L(LinkList L){
  16. LinkList p = L->next;
  17. int j = 0;
  18. while(p){
  19. p = p->next;
  20. j++;
  21. }
  22. return j;
  23. }
  24. /*头插法创建链表*/
  25. int CreateListHead_L(LinkList &L,int n){
  26. for(int i=n;i>0;i--){
  27. LinkList newNode = (LinkList)malloc(sizeof(LNode));//生成新的结点
  28. printf("请输入第 %d 个的元素:",n-i+1);
  29. scanf("%d",&newNode->data);//将输入的值赋给新创建结点的data
  30. newNode->next = L->next;//将新生成的结点指向头结点的下一个结点
  31. L->next = newNode;//将头结点指向新生成的结点
  32. }
  33. return 0;
  34. }
  35. /*尾插法创建链表*/
  36. int CreateListRear_L(LinkList &L,int n){
  37. LinkList r=L;//尾指针指向此链表
  38. for(int i=0;i<n;i++){
  39. LinkList newNode = (LinkList)malloc(sizeof(LNode));//生成新的结点
  40. printf("请输入第 %d 个的元素:",i+1);
  41. scanf("%d",&newNode->data);
  42. newNode->next = r->next;//将新生成的结点指向头结点的下一个结点
  43. r->next = newNode;//将新生成的结点指向头结点的下一个结点
  44. r = newNode;//将尾指针指向新生成的结点,新结点每次都插入到最后
  45. }
  46. return 0;
  47. }
  48. /*取值(获取链表指定位置的数据) */
  49. int GetElem_L(LinkList L,int i){
  50. int j=0;
  51. LinkList p=L->next;
  52. while(p&&j<i-1){
  53. p = p->next;
  54. j++;
  55. }
  56. return p->data;
  57. }
  58. /*打印链表中的元素*/
  59. int PrintList_L(LinkList L) {
  60. LinkList p = L->next;
  61. while(p){
  62. printf("%d ",p->data);
  63. p = p->next;
  64. }
  65. printf("\n");
  66. return 0;
  67. }
  68. /*合并两个链表*/
  69. int MergeList_L(LinkList &La,LinkList &Lb) {
  70. LinkList pa = La->next;
  71. LinkList pb = Lb->next;
  72. LinkList pc = La; //用使用La的头结点 作为合成后的头结点
  73. while(pa&&pb){
  74. if(pa->data<=pb->data){
  75. pc->next = pa;
  76. pc = pa; //将pc指针指向新链表的最后一个结点
  77. pa = pa->next;
  78. }else{
  79. pc->next = pb;
  80. pc = pb; //将pc指针指向新链表的最后一个结点
  81. pb = pb->next;
  82. }
  83. }
  84. pc->next = pa?pa:pb;
  85. free(Lb);
  86. return 0;
  87. }
  88. main(){
  89. LinkList La,Lb;
  90. //初始化
  91. int aInitStatus;//La初始化状态
  92. int bInitStatus;//Lb初始化状态
  93. int isEmpty;//是否为空
  94. int headInsertStatus;//头插法插入状态
  95. int rearInsertStatus;//删除状态
  96. int listLength;//链表长度
  97. int num;//插入元素的个数
  98. aInitStatus = InitList_L(La);
  99. bInitStatus = InitList_L(Lb);
  100. if(bInitStatus==0&&aInitStatus==0){
  101. printf("初始化成功!copyright@www.it1997.com\n");
  102. } else{
  103. printf("初始化失败!\n");
  104. }
  105. /*尾插法*/
  106. printf("【尾插法】\n");
  107. /*创建链表La*/
  108. printf("请输入创建链表La元素的个数:");
  109. scanf("%d",&num);
  110. rearInsertStatus = CreateListRear_L(La,num);
  111. if(rearInsertStatus==0){
  112. printf("尾插法插入成功!copyright@www.it1997.com\n");
  113. } else{
  114. printf("尾插法插入失败!copyright@www.it1997.com\n");
  115. }
  116. printf("======华丽分割线======\n");
  117. printf("链表La为:");
  118. PrintList_L(La);
  119. /*创建链表Lb*/
  120. printf("请输入创建链表Lb元素的个数:");
  121. scanf("%d",&num);
  122. rearInsertStatus = CreateListRear_L(Lb,num);
  123. if(rearInsertStatus==0){
  124. printf("尾插法插入成功!copyright@www.it1997.com\n");
  125. } else{
  126. printf("尾插法插入失败!copyright@www.it1997.com\n");
  127. }
  128. printf("======华丽分割线======\n");
  129. printf("链表Lb为:");
  130. PrintList_L(Lb);
  131. printf("======华丽分割线======\n");
  132. MergeList_L(La,Lb);
  133. printf("合并后链表为:");
  134. PrintList_L(La);
  135. }

file

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/程序诗人2/article/detail/62955
推荐阅读
相关标签
  

闽ICP备14008679号