題目鏈結
給你乙個鍊錶陣列,每個鍊錶都已經按公升序排列。
請你將所有鍊錶合併到乙個公升序鍊錶中,返回合併後的鍊錶。
示例1:
輸入:lists =[[
1,4,
5],[
1,3,
4],[
2,6]
]輸出:[1,
1,2,
3,4,
4,5,
6]解釋:鍊錶陣列如下:[1
->4-
>5,
1->3-
>4,
2->6]
將它們合併到乙個有序鍊錶中得到。1-
>1-
>2-
>3-
>4-
>4-
>5-
>
6
示例2:
輸入:lists =
輸出:[
]
示例3:
輸入:lists =[[
]]輸出:[
]
在思考如何解決合併k個公升序鍊錶之前,考慮如何合併兩個公升序鍊錶。
合併兩個鍊錶的過程有點類似於歸併排序中並的過程,利用兩個指標分別遍歷兩個鍊錶,比較當前兩個節點中數的大小,將較小的數加入新鍊錶即可。
listnode*
mergetwolists
(listnode* l1, listnode* l2)
else
cur = cur-
>next;
} cur-
>next = l1 ==
nullptr
? l2 : l1;
return head-
>next;
}
既然我們現在已經知道了如何合併兩個鍊錶,那麼我們可以令結果鍊錶為a,每次從鍊錶陣列中獲取乙個鍊錶b,不斷將a、b合併即可:
listnode*
mergeklists
(vector>
& lists)
return ans;
}
用分治法優化後的**:
listnode*
merge
(vector >
&lists,
int l,
int r)
if(l > r)
int mid =
(l + r)/2
;return
mergetwolists
(merge
(lists, l, mid)
,merge
(lists, mid +
1, r));
}listnode*
mergeklists
(vector>
& lists)
class
solution
else
cur = cur-
>next;
} cur-
>next = l1 ==
nullptr
? l2 : l1;
return head-
>next;
} listnode*
merge
(vector >
&lists,
int l,
int r)
if(l > r)
int mid =
(l + r)/2
;return
mergetwolists
(merge
(lists, l, mid)
,merge
(lists, mid +
1, r));
} listnode*
mergeklists
(vector>
& lists)
};
分治實現LeetCode 23題 合併K個排序鍊錶
紀念第一道沒有看題解做出來的困難題 分治思想 歸併排序實現合併k個排序鍊錶 由於是實現一連串已經排序的鍊錶,所以第一時間想到了歸併排序 又由於是實現多個鍊錶的總排序,為了減少時間複雜度又想到了分治思想,這一題中也就是二分法 做了這麼多天的題總算有點進步 class solution 結果陣列的頭結點...
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 定...
leetcode 23 合併K排序鍊錶
合併 k 個排序鍊錶,返回合併後的排序鍊錶。請分析和描述演算法的複雜度。示例 輸入 1 4 5,1 3 4,2 6 輸出 1 1 2 3 4 4 5 6 解析 看到這一題,馬上就能想到之前的合併兩個鍊錶leetcode 21.合併兩個有序鍊錶 這一題相當於上一題的公升級版,從合併的實現方法上來說可以...