23 合併K個排序鍊錶

2021-10-08 20:00:09 字數 2354 閱讀 8224

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

示例:輸入:

[1->4->5,

1->3->4,

2->6

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

這道題有三種解法,

1,逐個合併佇列,佇列1+佇列2=sum1,sum1+佇列3,=sum2,。。。直到合併完畢,這種演算法效率最低,為o(nk*k)

2,使用優先佇列,

把n個佇列的頭加入乙個優先佇列,每次取出第乙個元素e,肯定是當前最小的元素,

取出後,如果e.next!=null,把e.next加入佇列中,

直到隊列為空,合併完畢

複雜度為:o(kn×logk)。

3,把佇列兩兩合併,然後對合併後的結果進行兩兩合併,直到和為乙個,複雜度為: o(kn \times \log k)o(kn×logk)

詳細解釋,見leetcode官方

**如下:實現了1,和2,

public class solution15 ,  };

listnode lists = so3.getinitlist(inits);

listnode node = so3.mergeklists(lists);

do while (node != null);

system.out.println();

lists = so3.getinitlist(inits);

node = so3.mergeklists2(lists);

do while (node != null);

} /**

* 常規演算法,逐個比對,插入每個佇列

* * @param lists

* @return

*/public listnode mergeklists(listnode lists)

if (lists.length == 1)

listnode head = lists[0];

int headi = 0;

// 計算head的val

for (int i = 0; i < lists.length; i++)

if (head == null)

if (head.val > lists[i].val)

} lists[headi] = null;

listnode n = head;

listnode nx = null;

for (int i = 0; i < lists.length; i++)

// 從頭開始合併

n = head;

while (n.next != null && n2 != null) else

}if (n2 != null)

} return head;

} /**

* 把n個佇列的頭加入乙個優先佇列,每次取出第乙個元素e,肯定是當前最小的元素,

* 取出後,如果e.next!=null,把e.next加入佇列中,

* 直到隊列為空,合併完畢

* * @param lists

* @return

*/public listnode mergeklists2(listnode lists)

if (lists.length == 1)

queuepqe = new priorityqueue(new comparator()

if (o2 == null)

if (o1.val > o2.val)

return -1;

}});

for (int i = 0; i < lists.length; i++)

} listnode nx = null;

listnode head = pqe.poll();

if (head == null)

if (head.next != null)

boolean hasmore = true;// 判斷是否還有更多的資料需要加入佇列

nx = pqe.poll();

listnode n = head;

while (nx != null)

nx = pqe.poll();

} return head;

} listnode getinitlist(int towis)

listnode n = new listnode(ones[0]);

nodes[j] = n;

for (int i = 1; i < ones.length; i++)

} return nodes;

}}

23 合併K個排序鍊錶

合併 k 個排序鍊錶,返回合併後的排序鍊錶。請分析和描述演算法的複雜度。示例 輸入 1 4 5,1 3 4,2 6 輸出 1 1 2 3 4 4 5 6 偷懶直接複製了以前的堆的 所有看上去長了點 class priorityqueue priority是設定優先順序 true為大根堆 false為...

23 合併K個排序鍊錶

合併 k 個排序鍊錶,返回合併後的排序鍊錶。請分析和描述演算法的複雜度。採用分治法的思想,將 k 個排序鍊錶先合併為 k 2 個鍊錶。依次迴圈,直至合併為1個鍊錶為止。注意 從 k 到 k 2 時,如何定義索引,將每兩個鍊錶合併,而且必須符合奇數 偶數個鍊錶的情況。解決辦法 k n 1 2 list...

23 合併K個排序鍊錶

合併 k 個排序鍊錶,返回合併後的排序鍊錶。請分析和描述演算法的複雜度。示例 輸入 1 4 5,1 3 4,2 6 輸出 1 1 2 3 4 4 5 6 暴力法 將所有的節點放在乙個陣列中,然後對陣列排序,最後遍歷陣列,組建新的鍊錶。definition for singly linked list...