Menu
CoddyTech

Merge Two Sorted Lists

同じ長さの2つの配列にそれぞれ格納された、2つの単方向連結リストが与えられます。1つ目のリストでは、ノード i が値 values1[i] を持ち、ノード next1[i] につながっています。2つ目のリストも同様に、next2 と values2 を使います。どちらのリストも -1 で終わり、先頭ノードは 0 です。ノードはリストの順序どおりに格納されていないため、リンクをたどってください。

各リストは、リンクに沿って値が非減少順に並んでいます。2つのリストを1つのソート済みリストにマージし、値を順番に返してください。

関数

mergeTwoLists(next1: integer-array, values1: integer-array, next2: integer-array, values2: integer-array) → integer-array
next1integer-array
最初のリストの各ノードがリンクしているノードのインデックス。最後のノードの場合は -1
values1integer-array
最初のリストの各ノードが保持する値
next2integer-array
2つ目のリストの各ノードがリンクしているノードのインデックス。最後のノードの場合は-1
values2integer-array
2番目のリストの各ノードが保持する値
戻り値integer-array
マージされたリストの値(順番どおり)

制約

  • 1 ≤ L1 ≤ 2000。ここで、L1はnext1とvalues1の長さです。
  • 1 ≤ L2 ≤ 2000。ここで、L2はnext2とvalues2の長さです。
  • -1000 ≤ values1[i], values2[j] ≤ 1000
  • next1 の各エントリは -1 または最初のリストのノードインデックスであり、next2 の各エントリは -1 または2番目のリストのノードインデックスです。
  • ノード 0 から始めると、各リストはそのすべてのノードをそれぞれ1回だけ訪問し、その後 -1 に到達します。サイクルはありません。
  • リンクに沿って、各リストは非減少順に並んでいます。

例

入力
next1 = [2, -1, 1]values1 = [1, 6, 4]next2 = [3, 2, -1, 1]values2 = [2, 7, 9, 3]
出力
[1, 2, 3, 4, 6, 7, 9]
説明
リンクをたどると、最初のリストはノード 0, 2, 1 を訪れ、1, 4, 6 を読み取ります。2つ目のリストは 2, 3, 7, 9 を読み取ります。毎回先頭の小さい方を取ると、1, 2, 3, 4, 6, 7, 9 になります。
challenge icon

発展問題

k 個のソート済みリストを、ノードの総数が N のとき、O(N log k) 時間でマージできますか?

コードをリセット
def mergeTwoLists(next1, values1, next2, values2):
    # ここにコードを書いてください

テスト #1

テスト #2

テスト #3

引数

next1 = [2, -1, 1]
values1 = [1, 6, 4]
next2 = [3, 2, -1, 1]
values2 = [2, 7, 9, 3]

期待される出力

[1, 2, 3, 4, 6, 7, 9]