当前位置:   article > 正文

面试算法 牛客题目 合并k个已排序的链表 (利用 vector 动态数组)_c++合并升序链表面试题

c++合并升序链表面试题

1.题目:合并k个已排序的链表
描述
合并 k 个升序的链表并将结果作为一个升序的链表返回其头节点。

数据范围:节点总数 0 \le n \le 50000≤n≤5000,每个节点的val满足 |val| <= 1000∣val∣<=1000
要求:时间复杂度 O(nlogn)O(nlogn)

示例1
输入:
[{1,2,3},{4,5,6,7}]
返回值:
{1,2,3,4,5,6,7}


示例2
输入:
[{1,2},{1,4,5},{6}]
返回值:
{1,1,2,4,5,6}


2.算法:

1.暴力算法

2.递归算法


3.算法思路

两个两个的合并,最后合成为一个


4.代码:

  1. /*************************************************
  2. 作者:She001
  3. 时间:2022/9/21
  4. 题目:合并k个已排序的链表
  5. 描述
  6. 合并 k 个升序的链表并将结果作为一个升序的链表返回其头节点。
  7. 数据范围:节点总数 0 \le n \le 50000≤n≤5000,每个节点的val满足 |val| <= 1000∣val∣<=1000
  8. 要求:时间复杂度 O(nlogn)O(nlogn)
  9. 示例1
  10. 输入:
  11. [{1,2,3},{4,5,6,7}]
  12. 返回值:
  13. {1,2,3,4,5,6,7}
  14. 示例2
  15. 输入:
  16. [{1,2},{1,4,5},{6}]
  17. 返回值:
  18. {1,1,2,4,5,6}
  19. ***************************************************/
  20. #include<bits/stdc++.h>
  21. using namespace std;
  22. typedef struct node
  23. {
  24. int i;
  25. node *next;
  26. };
  27. void print(node * head)//打印链表
  28. {
  29. node* pp= head;//复制头节点
  30. while(pp!=NULL)//判断这个节点是否为空 链表是否结束
  31. {
  32. cout<<pp->i<<" ";
  33. pp=pp->next;//指向下一个
  34. }
  35. cout<<endl;
  36. }
  37. //链表的链接
  38. node * lianjie_1(node *a1 , node * b1)// a1 第一个链表的头节点, b1 第二个链表的头节点
  39. {
  40. node * head;//记录头节点
  41. if(a1 == NULL || b1 == NULL)
  42. {
  43. return a1 != NULL ? a1 : b1;
  44. }
  45. node * kk;//连接节点
  46. node* h1=a1;
  47. node * h2=b1;
  48. if((a1->i) < (b1->i))//找出最开始的头节点
  49. {
  50. head = a1;
  51. h1=h1->next;
  52. }
  53. else
  54. {
  55. head = b1;
  56. h2=h2->next;
  57. }
  58. kk=head;//开始连接其余的节点
  59. while(h1!=NULL && h2!=NULL)
  60. {
  61. if((h1->i) < (h2->i))//数值大小比较
  62. {
  63. kk->next=h1;//链表的连接
  64. h1=h1->next;//变成下一个数据
  65. kk=kk->next;//指向下一个节点,
  66. }
  67. else
  68. {
  69. kk->next=h2;
  70. h2=h2->next;
  71. kk=kk->next;
  72. }
  73. }
  74. if(h1==NULL)//还需要尾部的连接
  75. {
  76. kk->next=h2;
  77. }
  78. if(h2==NULL)
  79. {
  80. kk->next=h1;
  81. }
  82. return head;
  83. }
  84. //算法递归 的方法解决两个两个链表的合并
  85. node * lianjie_2(node * list1,node * list2) {
  86. // list1 list2为空的情况
  87. if(list1 == NULL || list2 == NULL ){
  88. return list1 != NULL ? list1 : list2;
  89. }
  90. // 两个链表元素依次对比
  91. if(list1->i <= list2->i ){
  92. // 递归计算 list1.next, list2
  93. list1->next = lianjie_2(list1->next, list2);
  94. return list1;
  95. }else{
  96. // 递归计算 list1, list2.next
  97. list2->next = lianjie_2(list1, list2->next);
  98. return list2;
  99. }
  100. }
  101. node *fangfa_1(vector<node *> &list)
  102. {
  103. vector<node* >::iterator it = list.begin();
  104. node* kk=*(list.begin());//获取第一个链表的头节点 也是返回结果的指针
  105. for(it=list.begin()+1;it!=list.end();it++)
  106. {
  107. kk=lianjie_1(kk,*(it));
  108. }
  109. return kk;
  110. }
  111. int main()
  112. {
  113. //建立一个容器 来存储 k 个 已经排序的链表
  114. vector<node *> lists; //这里我们存储三个链表
  115. //建立 第一个 单链表
  116. node *a1=new node;
  117. node *a2=new node;
  118. node *a3=new node;
  119. node *a4=new node;
  120. node *a5=new node;
  121. node *a6=new node;
  122. node *a7=new node;
  123. a1->i=1;//链表节点的复制
  124. a2->i=3;
  125. a3->i=4;
  126. a4->i=7;
  127. a5->i=9;
  128. a6->i=10;
  129. a7->i=15;
  130. a1->next=a2;//链表的连接
  131. a2->next=a3;
  132. a3->next=a4;
  133. a4->next=a5;
  134. a5->next=a6;
  135. a6->next=a7;
  136. a7->next=NULL;
  137. //建立 第二个 单链表
  138. node *b1=new node;
  139. node *b2=new node;
  140. node *b3=new node;
  141. node *b4=new node;
  142. node *b5=new node;
  143. node *b6=new node;
  144. node *b7=new node;
  145. b1->i=2;//链表节点的复制
  146. b2->i=5;
  147. b3->i=6;
  148. b4->i=8;
  149. b5->i=10;
  150. b6->i=11;
  151. b7->i=20;
  152. b1->next=b2;//链表的连接
  153. b2->next=b3;
  154. b3->next=b4;
  155. b4->next=b5;
  156. b5->next=b6;
  157. b6->next=b7;
  158. b7->next=NULL;
  159. //建立 第三个 单链表
  160. node *c1=new node;
  161. node *c2=new node;
  162. node *c3=new node;
  163. node *c4=new node;
  164. node *c5=new node;
  165. node *c6=new node;
  166. node *c7=new node;
  167. c1->i=4;//链表节点的复制
  168. c2->i=8;
  169. c3->i=12;
  170. c4->i=16;
  171. c5->i=17;
  172. c6->i=18;
  173. c7->i=29;
  174. c1->next=c2;//链表的连接
  175. c2->next=c3;
  176. c3->next=c4;
  177. c4->next=c5;
  178. c5->next=c6;
  179. c6->next=c7;
  180. c7->next=NULL;
  181. lists.insert(lists.end(),a1);//把 a1 这个链表的头节点添加进去
  182. lists.insert(lists.end(),b1);//把 b1 这个链表的头节点添加进去
  183. lists.insert(lists.end(),c1);//把 c1 这个链表的头节点添加进去
  184. //1 3 4 7 9 10 15
  185. //2 5 6 8 10 11 20
  186. //4 8 12 16 17 18 29
  187. node * gg=fangfa_1(lists);
  188. print(gg);
  189. return 0;
  190. }

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

闽ICP备14008679号