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]