合并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 2023-05-06 13:29  _月生  阅读(17)  评论(0)    收藏  举报