23. 合并 K 個升序鏈表
給你一個鏈表數組,每個鏈表都已經按升序排列。
請你將所有鏈表合并到一個升序鏈表中,返回合并后的鏈表。
//自己寫的垃圾
class Solution {
public:ListNode* mergeKLists(vector<ListNode*>& lists) {vector<int> record;int n = lists.size();for(int i=0;i<n;i++){while(lists[i]){record.push_back(lists[i]->val);lists[i]=lists[i]->next;}}if (record.empty()) {return nullptr;}sort(record.begin(),record.end());ListNode* res = new ListNode(record[0]);ListNode* cur = res;int len = record.size();for(int i=1;i<len;i++){cur->next = new ListNode(record[i]);cur = cur->next;}return res;}
};
沒有思考純粹取巧,放數組里排序后生成新的鏈表,回去等通知版
//抄的
class Solution {
public:ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {ListNode dummy(0);ListNode* tail = &dummy;while (l1 && l2) {if (l1->val < l2->val) {tail->next = l1;l1 = l1->next;} else {tail->next = l2;l2 = l2->next;}tail = tail->next;}tail->next = l1 ? l1 : l2;return dummy.next;}ListNode* mergeKLists(vector<ListNode*>& lists) {if (lists.empty()) return nullptr;int k = lists.size();while (k > 1) {for (int i = 0; i < k / 2; ++i) {lists[i] = mergeTwoLists(lists[i], lists[k - 1 - i]);}k = (k + 1) / 2;}return lists[0];}
};
面試該寫的算法,分治歸并算法
邏輯說起來也很簡單,兩兩合并的意思,為了方便循環,一頭一尾開始合并,然后逐次減半k值。
比較需要注意的就是k減半的計算,舉例子算算就好了
每層的時間復雜度都是 O(N),共有 log?K 層。??總時間復雜度 = O(N log K)??。