1. 程式人生 > >23. 合併K個排序連結串列

23. 合併K個排序連結串列

合併 k 個排序連結串列,返回合併後的排序連結串列。請分析和描述演算法的複雜度。

示例:

輸入:
[
  1->4->5,
  1->3->4,
  2->6
]
輸出: 1->1->2->3->4->4->5->6

分析:先合併兩個有序連結串列,然後再將先前合併的與剩餘的連結串列繼續兩兩合併。時間複雜度為O(logn)

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution { public: ListNode* mergeKLists(vector<ListNode*>& lists) { if(lists.empty()) { return NULL; } int n = lists.size(); while(n > 1) { int k = (n + 1) / 2; for(int i = 0; i < n / 2; i++) { lists[
i] = merge2List(lists[i], lists[i + k]); } n = k; } return lists[0]; } ListNode* merge2List(ListNode* n1, ListNode* n2) { ListNode dummy(0); ListNode* p = &dummy; while(n1 && n2) { if(n1->val < n2->
val) { p->next = n1; n1 = n1->next; } else { p->next = n2; n2 = n2->next; } p = p->next; } if(n1) { p->next = n1; } else if(n2) { p->next = n2; } return dummy.next; } };