Menu
CoddyTech

Merge k Sorted Lists

むずかしいヒープ連結リストpython iconjava iconcpp iconc iconjs icon+10

listsの行として、整数のリストをk個受け取ります。各行は非減少順にソートされており、行ごとに長さは異なる場合があり、空の行はありません。

すべての行のすべての値を含む1つのリストにマージし、非減少順にソートして返してください。ある値が1つの行または複数の行に何度か現れる場合、結果にもその回数だけ現れます。

関数

mergeKLists(lists: integer-2d-array) → integer-array
listsinteger-2d-array
行ごとに並べ替えられたリスト(長さは異なる場合があります)
戻り値integer-array
すべての行のすべての値を、1つのソート済みリストに

制約

  • 1 ≤ lists.length ≤ 104
  • 1 ≤ lists[i].length、すべての行を合わせて最大 104 個の値を保持します
  • -104 ≤ lists[i][j] ≤ 104
  • すべての行は非減少順に並べ替えられています。

例

入力
lists = [[2, 6, 9], [1, 4, 10], [3, 5]]
出力
[1, 2, 3, 4, 5, 6, 9, 10]
説明
全体で最小の値は1で、2行目の最初の値です。その後、各行は2、4、3で始まるため、次は2で、その後も同様です。3行目は5の後で値がなくなるため、最後に6、9、10が残ります。

lock icon提出時に隠しテスト+14件

challenge icon

発展問題

すべての行から少なくとも1つの値を含む最小の範囲 [a, b] を見つけます。行の先頭要素を格納した同じヒープと、これまでの最大の先頭要素を使って、O(N log k) で見つけられるでしょうか?

コードをリセット
def mergeKLists(lists):
    # ここにコードを書いてください
テストケース

ケース1

ケース2

ケース3

入力

lists = [[2, 6, 9], [1, 4, 10], [3, 5]]

期待値

[1, 2, 3, 4, 5, 6, 9, 10]