給你乙個鍊錶陣列,每個鍊錶都已經按公升序排列。
請你將所有鍊錶合併到乙個公升序鍊錶中,返回合併後的鍊錶。
示例 1:
輸入:lists = [[1,4,5],[1,3,4],[2,6]]輸出:[1,1,2,3,4,4,5,6]解釋:鍊錶陣列如下:示例 2:[ 1->4->5,
1->3->4,
2->6
]將它們合併到乙個有序鍊錶中得到。
1->1->2->3->4->4->5->6
輸入:lists =輸出:示例 3:
輸入:lists = 輸出:
優先佇列實現:1、將vector建立成小頂堆(要求公升序),時間複雜度為o(n),n為鍊錶個數
2、從小頂堆中pick出頂部鍊錶的head元素,並使用head->next頂替原本位置(優先佇列的push),再重新維護小頂堆,時間複雜度為o(lg n)
3、堆頂鍊錶pick空掉之後,將堆頂與堆的最後乙個元素互換,並調整堆的size
4、重複pick行為,直到所有元素都被pick出來,此處時間複雜度為 o(m * lg n),m為總元素個數,n為鍊錶個數
5、總體時間複雜度為 o(n) + o(m * lg n),其中m >= n恆成立,故而時間複雜度為o(m * lg n)
/**
* definition for singly-linked list.
* struct listnode
* listnode(int x) : val(x), next(nullptr) {}
* listnode(int x, listnode *next) : val(x), next(next) {}
* };
*/#define parent(i) (((i + 1) >> 1) - 1)
#define left(i) (((i + 1) << 1) - 1)
#define right(i) ((i + 1) << 1)
class solution
}if (lists.size() == 0)
return null;
if (lists.size() == 1)
return lists[0];
build_min_heap(lists);
listnode *head = null, *cur = null, *tmp = null;
cur = pick_node(lists);
head = cur;
while(cur)
return head;
}void heapify(int pos, vector& lists)
if (lists.size() == 0 || lists.size() == 1)
return;
if (lists[pos] == null)
int min = lists[pos]->val;
listnode* tmp = lists[pos];
int min_pos = pos;
if (left(pos) < lists.size() && min > lists[left(pos)]->val)
if (right(pos) < lists.size() && min > lists[right(pos)]->val)
if (min_pos != pos)
}void build_min_heap(vector& lists)
for (int pos = parent(lists.size() - 1); pos >= 0; pos--)
return;
}listnode* pick_node(vector& lists)
lists[0] = tmp->next;
heapify(0, lists);
return tmp;
}};
LeetCode 23 合併 K個排序序列
合併 k 個排序鍊錶,返回合併後的排序鍊錶。請分析和描述演算法的複雜度。示例 輸入 1 4 5,1 3 4,2 6 輸出 1 1 2 3 4 4 5 6 解題思路 採用分治的思想,將 k 個鍊錶的合併問題轉換成,合併 2 個有序鍊錶的問題 typedef struct listnode list 定...
Leetcode23 合併K個排序鍊錶
題目 解題思路 這道題使用的是分治演算法。首先還用輔助函式mergetwolists 用來合併兩個有序單鏈表,不申請額外的空間實現原地合併。如下 listnode mergetwolists listnode l1,listnode l2 else head nexthead while l1 nu...
leetcode 23 合併K個排序鍊錶
合併 k 個排序鍊錶,返回合併後的排序鍊錶。請分析和描述演算法的複雜度。示例 輸入 1 4 5,1 3 4,2 6 輸出 1 1 2 3 4 4 5 6分析 我想是k次歸併。時間複雜度是 k 1 nlogn。題目分析 本題首先將每個鍊錶的首元素取出,構建乙個最小堆。堆頂則為最小的元素,用最小元素所在...