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]