Menu
CoddyTech

Intersection of Two Linked Lists

Hai danh sách liên kết đơn nằm trong cùng một nhóm nút. Nút i liên kết với nút next[i], còn -1 đánh dấu điểm kết thúc danh sách. Danh sách A bắt đầu tại nút headA, còn danh sách B bắt đầu tại nút headB. Các nút không được lưu theo thứ tự cụ thể nào, vì vậy hãy lần theo các liên kết.

Hai danh sách có thể nhập vào nhau: từ một nút nào đó trở đi, chúng tiếp tục đi qua cùng những nút cho đến cuối. Hãy trả về chỉ số của nút đầu tiên có mặt trong cả hai danh sách, hoặc -1 nếu chúng không có nút chung.

Hàm

getIntersectionNode(next: integer-array, headA: integer, headB: integer) → integer
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 trong danh sách
headAinteger
nút đầu tiên của danh sách A
headBinteger
nút đầu tiên của danh sách B
Trả vềinteger
nút đầu tiên mà cả hai danh sách cùng có, hoặc -1

Ràng buộc

  • 2 ≤ n ≤ 104, trong đó n là độ dài của next.
  • Mỗi next[i] là -1 hoặc chỉ số nút từ 0 đến n-1.
  • 0 ≤ headA, headB ≤ n-1 và headA ≠ headB.
  • Cả hai danh sách đều kết thúc ở -1 mà không đi qua một nút nào hai lần. Không có chu trình.
  • Mỗi nút thuộc danh sách A, danh sách B hoặc cả hai.

Ví dụ

Đầu vào
next = [-1, 4, 1, 5, 0, 1]headA = 3headB = 2
Đầu ra
1
Giải thích
A đi qua 3, 5, 1, 4, 0 và B đi qua 2, 1, 4, 0. Từ nút 1 trở đi, hai đường đi có chung mọi nút, và không có nút nào trước đó của A nằm trên đường đi của B, nên đáp án là 1.
challenge icon

Câu hỏi mở rộng

Bạn có thể tìm nút trong thời gian O(m + k) với bộ nhớ phụ O(1) không?

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

Kiểm thử #1

Kiểm thử #2

Kiểm thử #3

Đối số

next = [-1, 4, 1, 5, 0, 1]
headA = 3
headB = 2

Đầu ra mong đợi

1