Menu
CoddyTech

Reorder List

Дан односвязный список, хранящийся в двух массивах одинаковой длины. Узел i содержит значение values[i] и указывает на узел next[i], -1 обозначает конец списка, а головой является узел 0. Узлы хранятся не в порядке следования в списке, поэтому переходите по ссылкам.

Обозначим узлы в порядке следования в списке как L0, L1, ..., Lk. Переставьте узлы так, чтобы список имел порядок L0, Lk, L1, Lk-1, L2, Lk-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. Цикла нет.

Примеры

Ввод
next = [3, 4, -1, 1, 2]values = [1, 3, 5, 2, 4]
Вывод
[1, 5, 2, 4, 3]
Пояснение
Если следовать по ссылкам от узла 0, список будет таким: 1, 2, 3, 4, 5. Первый, последний, второй и предпоследний элементы дают 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]