題目:
合並 k 個排序鏈表,返回合並后的排序鏈表。請分析和描述算法的復雜度。
示例:
輸入:
[
1->4->5,
1->3->4,
2->6
]
輸出: 1->1->2->3->4->4->5->6
看到這道題,能想起來昨天我寫的有一篇和這個題有些類似的博客,【合並兩個有序的鏈表】
因此這個題的思路就是
1.k個有序的鏈表,根據我們之前做的那道題,應該采用兩兩合並,也就是累加法,最后合並到一起去
2.兩個鏈表的長度可能不一樣,我們需要考慮補全的問題。
代碼如下:
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode mergeKLists(ListNode[] lists) {
ListNode res = new ListNode(0); //設置結果
if(lists == null || lists.length < 0){
return null;
}else if(lists.length == 1){
return lists[0];
}else if(lists.length == 2){
mergeTwoLists(lists[0],lists[1]);
}else{
res = mergeTwoLists(lists[0],lists[1]);
for(int i = 2; i < lists.length;i++){
mergeTwoLists(res,lists[i]);
}
}
return res;
}
public ListNode mergeTwoLists(ListNode l1,ListNode l2){
ListNode res = new ListNode(0);
ListNode tmp = res;
while(l1 != null && l2 != null){
if(l1.val < l2.val){
tmp.next = l1;
l1 = l1.next;
}else{
tmp.next = l2;
l2 = l2.next;
}
tmp = tmp.next;
}
//后面是為了補全的,因為鏈表的長度可能不一樣
if(l1 != null){
tmp.next = l1;
}else{
tmp.next = l2;
}
return res.next;
}
}
在別的博客中看到另一種解法,就是用優先隊列,感覺挺高大上的,所以貼出來和大家分享,只是上面的方法我們容易理解一些罷了。
代碼如下:
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode mergeKLists(ListNode[] lists) {
if(lists == null || lists.length < 0){
return null;
}
PriorityQueue<Integer> queue = new PriorityQueue();
for(ListNode node:lists){
while(node != null){
queue.add(node.val);
node = node.next;
}
}
ListNode res = new ListNode(0);
ListNode tmp= res;
while(!queue.isEmpty()){
ListNode temp = new ListNode(queue.poll());
tmp.next = temp;
tmp = tmp.next;
}
return res.next;
}
}
