Menu
CoddyTech

Intersection of Two Linked Lists

توجد قائمتان مترابطتان أحاديتا الاتجاه ضمن مجموعة واحدة من العقد. ترتبط العقدة i بالعقدة next[i]، وتنتهي القائمة عند -1. تبدأ القائمة A من العقدة headA، والقائمة B من العقدة headB. لا تُخزَّن العقد بترتيب معيّن، لذا اتبع الروابط.

قد تلتقي القائمتان: ابتداءً من عقدة ما، تتابعان عبر العقد نفسها حتى النهاية. أَعِد فهرس أول عقدة مشتركة بين القائمتين، أو -1 إذا لم تشتركا في أي عقدة.

الدالة

getIntersectionNode(next: integer-array, headA: integer, headB: integer) → integer
nextinteger-array
فهرس العقدة التي ترتبط بها كل عقدة، أو ‎-1‎ للعقدة الأخيرة في القائمة
headAinteger
العقدة الأولى في القائمة A
headBinteger
العقدة الأولى في القائمة B
تُرجعinteger
العقدة الأولى المشتركة بين القائمتين، أو ‎-1‎

القيود

  • 2 ≤ n ≤ 104، حيث إن n هو طول next.
  • كل next[i] إما -1 أو فهرس عقدة من 0 إلى n-1.
  • 0 ≤ headA, headB ≤ n-1 و headA ≠ headB.
  • تنتهي كلتا القائمتين عند -1 من دون زيارة أي عقدة مرتين. لا توجد دورة.
  • كل عقدة موجودة في القائمة A، أو في القائمة B، أو في كلتيهما.

أمثلة

المدخلات
next = [-1, 4, 1, 5, 0, 1]headA = 3headB = 2
المخرجات
1
الشرح
تزور A العقد 3, 5, 1, 4, 0، وتزور B العقد 2, 1, 4, 0. ابتداءً من العقدة 1، يشتركان في كل عقدة، ولا توجد أي عقدة سابقة من A على B، لذا الإجابة هي 1.
challenge icon

سؤال إضافي

هل يمكنك العثور على العقدة في زمن O(m + k) باستخدام ذاكرة إضافية O(1)؟

إعادة ضبط الشيفرة
def getIntersectionNode(next, headA, headB):
    # اكتب الكود هنا

اختبار #1

اختبار #2

اختبار #3

الوسائط

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

الإخراج المتوقع

1