随笔 - 112  文章 - 0  评论 - 0  阅读 - 1426

合并k个已排序的链表

  • 描述
合并 k 个升序的链表并将结果作为一个升序的链表返回其头节点。
 
数据范围:节点总数 0n5000,每个节点的val满足val<=1000
要求:时间复杂度 O(nlogn)
 
  • 示例
输入:[{1,2},{1,4,5},{6}]
返回值:{1,1,2,4,5,6}
 
  • 算法思想
1、将k个链表两两进行合并(采用顺序合并的方法),这一过程的代码和合并两个排序的链表的过程一致,可以直接套用
2、第一轮合并后,k个链表合并成了 k/2 个链表
3、重复这一过程,然后是 k/4、k/8、...1个链表,从而可以获取最终的有序链表
 
  • 代码
复制代码
 1 /**
 2  * Definition for singly-linked list.
 3  * struct ListNode {
 4  *     int val;
 5  *     ListNode *next;
 6  *     ListNode(int x) : val(x), next(NULL) {}
 7  * };
 8  */
 9 class Solution {
10   public:
11     //合并两个链表
12     ListNode* merge(ListNode* pHead1, ListNode* pHead2) {
13         ListNode* pre = nullptr;
14         ListNode* p = pHead1;
15         ListNode* q = pHead2;
16         //特殊情况判断
17         if (pHead1 == nullptr)  return pHead2;
18         if (pHead2 == nullptr)  return pHead1;
19         //L2合并至L1
20         if (q->val >= p->val) {
21             while (p && q) {
22                 if (q->val >= p->val) {
23                     pre = p;
24                     p = pre->next;
25                 } else {
26                     ListNode* r = q->next;
27                     q->next = p;
28                     pre->next = q;
29                     pre = q;
30                     q = r;
31                 }
32             }
33 
34             if (q) {
35                 pre->next = q;
36             }
37             return pHead1;
38         } else {          //L1合并至L2
39             while (p && q) {
40                 if (p->val >= q->val) {
41                     pre = q;
42                     q = pre->next;
43                 } else {
44                     ListNode* r = p->next;
45                     p->next = q;
46                     pre->next = p;
47                     pre = p;
48                     p = r;
49                 }
50             }
51             if (p) {
52                 pre->next = p;
53             }
54             return pHead2;
55         }
56     }
57      // 分治进行链表两两合并
58     ListNode* mergeList(vector<ListNode*>& lists, int l, int r) {
59 
60         if (l == r) return lists[l];
61         if (l > r) return nullptr;
62 
63         int mid = (l + r) / 2;
64 
65         return merge(mergeList(lists, l, mid), mergeList(lists, mid + 1, r));
66     }
67 
68     ListNode* mergeKLists(vector<ListNode*>& lists) {
69         //采用分治法进行合并
70         return mergeList(lists, 0, lists.size() - 1);
71     }
72 };
复制代码

 

posted on   _月生  阅读(8)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具
· Manus的开源复刻OpenManus初探
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示