合併 k 個排序鏈表,返回合併後的排序鏈表javascript
示例:java
輸入:
[
1->4->5,
1->3->4,
2->6
]
輸出: 1->1->2->3->4->4->5->6
複製代碼
以前作過合併兩個有序鏈表,這道題增長難度,合併k個有序鏈表,基本上也是兩兩合併。 採用分治法,簡單來講就是不停的對半劃分,好比k個鏈表先劃分爲合併兩個k/2個鏈表的任務,再不停的往下劃分,直到劃分紅只有一個或兩個鏈表的任務,開始合併。bash
代碼中的k是經過 (len+1)/2 計算的,這裏爲啥要加1呢,這是爲了當len爲奇數的時候,k能始終從後半段開始,好比當len=5時,那麼此時k=3,則0和3合併,1和4合併,最中間的2空出來。當len是偶數的時候,加1也不會有影響,好比當len=4時,此時k=2,那麼0和2合併,1和3合併app
/*
* @lc app=leetcode.cn id=23 lang=javascript
*
* [23] 合併K個排序鏈表
*/
/**
* Definition for singly-linked list.
* function ListNode(val) {
* this.val = val;
* this.next = null;
* }
*/
/**
* @param {ListNode[]} lists
* @return {ListNode}
*/
var mergeKLists = function(lists) {
let len=lists.length;
if(len===0){
return null
}
if(len===1){
return lists[0]
}
while(len>1){
let k=parseInt((len+1)/2)
for(let i=0;i<parseInt(len/2);i++){
lists[i]=mergeTwoLists(lists[i],lists[i+k])
}
len=k;
}
return lists[0]
};
/**
* 合併兩個有序鏈表
*/
var mergeTwoLists = function(l1, l2) {
if(l1===null){
return l2;
}else if(l2===null){
return l1;
}
if(l1.val<l2.val){
l1.next=mergeTwoLists(l1.next,l2)
return l1
}else{
l2.next=mergeTwoLists(l1,l2.next)
return l2
}
};
複製代碼