Menu
CoddyTech

Reorder List

同じ長さの2つの配列に格納された単方向リンクリストが与えられます。ノード i は値 values[i] を保持し、ノード next[i] へのリンクを持ちます。-1 はリストの終端を示し、先頭ノードは 0 です。ノードはリストの順序どおりに格納されていないため、リンクをたどってください。

リストの順序に従ってノードを L0, L1, ..., Lk と呼びます。リストを L0, Lk, L1, Lk-1, L2, Lk-2, ... の順になるように並べ替えます。つまり、最初のノード、最後のノード、2番目のノード、最後から2番目のノード、という順に並べます。新しい順序で値を返してください。

関数

reorderList(next: integer-array, values: integer-array) → integer-array
nextinteger-array
各ノードがリンクするノードのインデックス、または最後のノードの場合は -1
valuesinteger-array
各ノードが保持する値
戻り値integer-array
並べ替え後のリストの順序における値

制約

  • 1 ≤ n ≤ 4000。ここで、n は next と values の長さです。
  • -1000 ≤ values[i] ≤ 1000
  • 各next[i]は-1、または0からn-1までのノードインデックスです。
  • ノード 0 から始まり、リストはすべてのノードをちょうど1回ずつ訪れ、その後 -1 に到達します。循環はありません。

例

入力
next = [3, 4, -1, 1, 2]values = [1, 3, 5, 2, 4]
出力
[1, 5, 2, 4, 3]
説明
ノード 0 からリンクをたどると、リストは 1, 2, 3, 4, 5 となります。最初、最後、2番目、最後から2番目の順にすると 1, 5, 2, 4 となり、中央の値 3 は最後になります。
challenge icon

発展問題

追加メモリ O(1) でリンク自体を並べ替えることはできますか?

コードをリセット
def reorderList(next, values):
    # ここにコードを書いてください

テスト #1

テスト #2

テスト #3

引数

next = [3, 4, -1, 1, 2]
values = [1, 3, 5, 2, 4]

期待される出力

[1, 5, 2, 4, 3]