23 合併k個有序鍊錶

2022-07-02 11:36:08 字數 1469 閱讀 4022

合併 k 個排序鍊錶,返回合併後的排序鍊錶。請分析和描述演算法的複雜度。

示例:

輸入:

[  1->4->5,

1->3->4,

2->6

]輸出: 1->1->2->3->4->4->5->6

我們熟悉的是兩個鍊錶之間的合併,這道題的難點在於k值是不固定的,並不知道要合併多少鍊錶。一種很常見的想法就是使用分治法,因為合併兩個有序鍊錶是合併k個有序鍊錶的子問題。

多次進行兩個鍊錶之間的合併,將k個有序鍊錶轉化為(k+1)/2個有序鍊錶。例如有6個鍊錶時,想要合併為3個鍊錶,則鍊錶0與鍊錶3合併得到新的鍊錶0,鍊錶1與鍊錶4合併得到新的鍊錶1,鍊錶2與鍊錶5合併得到新的鍊錶2。最終所有鍊錶結點都合併到了鍊錶0,即為所求結果。

舉例說明該過程:

[[1,4,5],[1,3,4],[2,6]]->[[1,2,4,5,6],[1,3,4]]->[[1,1,2,3,4,4,5,6]]

listnode*mergetwolists(listnode*l1,listnode*l2)

else

cur=cur->next;

}if(l1) cur->next=l1;

if(l2) cur->next=l2;

return dummy->next;

}listnode* mergeklists(vector& lists)

else

cur=cur->next;

}if(l1) cur->next=l1;

if(l2) cur->next=l2;

return dummy->next;

}listnode*helper(vector&lists,int left,int right)

listnode* mergeklists(vector& lists)

首先將k個鍊錶的首元素新增到最小堆,取出最小元素加入到結果鍊錶中。再將所加元素的下乙個元素加入到最小堆(此時的最小元素要麼還在最小堆中,要麼是之前所加元素的下乙個元素),取出最小元素加入到結果鍊錶中。以此類推,直到堆中沒有元素為止。

public listnode mergeklists(listnode lists)

});listnode dummy=new listnode(-1);

listnode cur=dummy;

for(int i=0;i依次遍歷所有鍊錶,記錄所有元素中的最小值和最大值,那麼每個元素值必定在它們兩者之間。同時記錄所有元素出現的次數。然後就可以從最小值遍歷到最大值,根據其出現的次數建立相應個數的結點。

public listnode mergeklists(listnode lists)

}for(int i=min;i<=max;++i){

if(!hashmap.containskey(i)) continue;

for(int j=0;jleetcode原題:

LeetCode23 合併K個有序鍊錶

leetcode23 合併k個有序鍊錶 題目描述 給你乙個鍊錶陣列,每個鍊錶都已經按公升序排列。請你將所有鍊錶合併到乙個公升序鍊錶中,返回合併後的鍊錶。示例 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...

23 合併K個排序鍊錶 有序鍊錶的合併問題

題目描述 合併 k 個排序鍊錶,返回合併後的排序鍊錶。請分析和描述演算法的複雜度。示例 輸入 1 4 5,1 3 4,2 6 輸出 1 1 2 3 4 4 5 6 題目分析 首先寫乙個將兩個有序鍊錶合併為乙個鍊錶的函式,使用此函式將lists中的所有鍊錶依次合併到第乙個鍊錶當中。definition...

合併K個有序鍊錶

public class 023 mergeklists 堆中結點類 author luzhen work pc private static class node implements comparable override public int compareto node o 將k個有序鍊錶歸...