Menu
CoddyTech

Reorder List

Bạn được cung cấp một danh sách liên kết đơn được lưu trong hai mảng có cùng độ dài. Nút i chứa giá trị values[i] và liên kết đến nút next[i], -1 đánh dấu điểm kết thúc danh sách và nút đầu là nút 0. Các nút không được lưu theo thứ tự trong danh sách, vì vậy hãy lần theo các liên kết.

Gọi các nút theo thứ tự trong danh sách là L0, L1, ..., Lk. Sắp xếp lại danh sách theo thứ tự L0, Lk, L1, Lk-1, L2, Lk-2, ...: nút đầu tiên, rồi đến nút cuối cùng, tiếp theo là nút thứ hai, rồi đến nút gần cuối, cứ thế tiếp tục. Trả về các giá trị theo thứ tự mới đó.

Hàm

reorderList(next: integer-array, values: integer-array) → integer-array
nextinteger-array
chỉ số của nút mà mỗi nút liên kết đến, hoặc -1 nếu là nút cuối cùng
valuesinteger-array
giá trị mà mỗi nút lưu giữ
Trả vềinteger-array
các giá trị theo thứ tự của danh sách đã sắp xếp lại

Ràng buộc

  • 1 ≤ n ≤ 4000, trong đó n là độ dài của next và values.
  • -1000 ≤ values[i] ≤ 1000
  • Mỗi next[i] là -1 hoặc chỉ số nút từ 0 đến n-1.
  • Bắt đầu từ nút 0, danh sách đi qua mỗi nút đúng một lần rồi đến -1. Không có chu trình.

Ví dụ

Đầu vào
next = [3, 4, -1, 1, 2]values = [1, 3, 5, 2, 4]
Đầu ra
[1, 5, 2, 4, 3]
Giải thích
Theo các liên kết từ nút 0, danh sách có các giá trị 1, 2, 3, 4, 5. Giá trị đầu tiên, cuối cùng, thứ hai và áp chót lần lượt là 1, 5, 2, 4, còn giá trị ở giữa 3 đứng cuối.
challenge icon

Câu hỏi mở rộng

Bạn có thể sắp xếp lại chính các liên kết bằng bộ nhớ bổ sung O(1) không?

Đặt lại code
def reorderList(next, values):
    # Viết code ở đây

Kiểm thử #1

Kiểm thử #2

Kiểm thử #3

Đối số

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

Đầu ra mong đợi

[1, 5, 2, 4, 3]