合併 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...