給你乙個鍊錶陣列,每個鍊錶都已經按公升序排列。
請你將所有鍊錶合併到乙個公升序鍊錶中,返回合併後的鍊錶。
前置知識:合併兩個有序鍊錶,**如下,時間複雜度o(n
)o(n)
o(n)
,空間複雜度為o(1
)o(1)
o(1)
listnode*
mergetwolists
(listnode *a, listnode *b)
else
tail = tail-
>next;
} tail-
>next =
(aptr ? aptr : bptr)
;return head.next;
}
這道題有很多解法,我們來看看吧,假設有k
個鍊錶,每個鍊錶的長度為n
方法一:暴力求解
遍歷所有鍊錶,將所有值存入到乙個陣列中,對陣列進行快速排序,然後通過陣列構造鍊錶
時間複雜度為o(k
nlog
(kn)
)o(knlog(kn))
o(knlo
g(kn
)),空間複雜度為o(n
)o(n)
o(n)
方法二:逐步比較
與合併兩個有序鍊錶類似,每一步比較 k 個鍊錶的首元素,將最小的新增到新構造的鍊錶中
時間複雜度為o(k
2n
)o(k^2n)
o(k2n)
,空間複雜度為o(n
)o(n)
o(n)
方法三:優先佇列
遍歷所有鍊錶,將所有值存入優先佇列中,然後依次取出構造鍊錶
時間複雜度為o(k
n×lo
gk
)o(kn\times logk)
o(kn×l
ogk)
,空間複雜度為o(n
)o(n)
o(n)
,**如下:
class
solution};
priority_queue q;
listnode*
mergeklists
(vector>
& lists));
} listnode head,
*tail =
&head;
while
(!q.
empty()
));}
return head.next;}}
;
方法四:順序合併
第乙個鍊錶和第二個鍊錶合併,然後用合併的結果與接下來的鍊錶合併
時間複雜度為o(k
2n
)o(k^2n)
o(k2n)
,空間複雜度為o(1
)o(1)
o(1)
,**如下:
class
solution
else
tail = tail-
>next;
} tail-
>next =
(aptr ? aptr : bptr)
;return head.next;
} listnode*
mergeklists
(vector>
& lists)
return ans;}}
;
方法五:分治合併
此題的最佳解法,將k
個鍊錶配對並將同一對中的鍊錶合併, 第一輪合併後,k 個鍊錶被合併成k / 2
個,下一輪被合併成k / 4
個,依此類推,直到得到最終的有序鍊錶
時間複雜度為o(k
n×lo
gk
)o(kn\times logk)
o(kn×l
ogk)
,空間複雜度為o(l
ogk)
o(logk)
o(logk
),**如下:
class
solution
else
tail = tail-
>next;
} tail-
>next =
(aptr ? aptr : bptr)
;return head.next;
} listnode*
merge
(vector >
&lists,
int l,
int r)
listnode*
mergeklists
(vector>
& lists)
};
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.合併兩個有序鍊錶 這一題相當於上一題的公升級版,從合併的實現方法上來說可以...
leetcode 合併K個公升序鍊錶 23
給你乙個鍊錶陣列,每個鍊錶都已經按公升序排列。請你將所有鍊錶合併到乙個公升序鍊錶中,返回合併後的鍊錶。遍歷所有鍊錶將節點值加入列表中,對列表進行公升序 根據列表建立新的鍊錶 將所有鍊錶元素新增至列表中,然後對列表進行排序,然後基於列表建立鍊錶,def mergeklists v0 self,list...