K個排序鍊錶的合併

2021-10-05 16:05:05 字數 1140 閱讀 7044

問題描述;

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

示例:輸入:

[1->4->5,

1->3->4,

2->6

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

解法一:

暴力求解,遍歷k個鍊錶,找到其中頭結點最小的那個,將該節點插到合併鍊錶的尾部,該節點後移。重複上述工作直到陣列中k個排序鍊錶都為null。

實現**如下:

public listnode mergeklists(listnode lists) 

flag = true;

minvalue = lists[i].val < minvalue ? lists[i].val : minvalue;

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

if(minvalue == lists[i].val)}}

return head.next;

}

假設每個鍊錶長度為n,則上述方法的時間複雜度為o(k*k* n),由於總共k*n個元素,每個元素都需要經過k輪迴圈。

解法二:

使用歸併排序的思想,將lists陣列中的鍊錶兩兩合併,如此最終剩下乙個大煉表。為了避免開闢新空間,總是將當前陣列的兩端依次合併,並將結果儲存在前面的位置上。該方式下每個節點不需要比較k次,只需log(k)即可。因此時間複雜度降為o(log(k) * k * n)

實現**如下:

public listnode mergetwolists(listnode l1, listnode l2) else

cur = cur.next;

}if(cur1 != null)else

return head.next;

}public listnode mergeklists(listnode lists)

for(int end = lists.length - 1; end > 0; end = end / 2)

return lists[0];

}public void step(listnode lists, int start, int end)

}

合併k個排序鍊錶

合併k個排序鍊錶,並且返回合併後的排序鍊錶。嘗試分析和描述其複雜度。樣例 給出3個排序鍊錶 2 4 null,null,1 null 返回 1 2 4 null 兩兩合併 合併ab得到c 合併cd得到e definition for listnode.public class listnode pu...

合併K個排序鍊錶

從21.合併兩個有序鍊錶的基礎上,我們已經能夠解決兩個有序鍊錶的問題,現在是k個有序鍊錶,我們可以將第一二個有序鍊錶進行合併,然後將新的有序鍊錶再繼續跟第三個有序鍊錶合併,直到將所有的有序鍊錶合併完成。這樣做思路上是可行的,但是演算法的時間複雜度將會很大,具體就不計算了。有興趣的自己計算下。根據思路...

合併K個排序鍊錶

題目 合併 k 個排序鍊錶,返回合併後的排序鍊錶。請分析和描述演算法的複雜度。示例 輸入 1 4 5,1 3 4,2 6 輸出 1 1 2 3 4 4 5 6 思路 設定乙個堆,每次把每個鍊錶的頭結點放入堆中。記錄每個節點的值與在原陣列中的位置,便於鍊錶往下走。彈出堆中最小值,把最小值所在位置的陣列...