İçeriğe atla
ΣDSA Patterns
Menü
Dil

Hızlı ve Yavaş İşaretçi

Rehber 4 / 6 · Yol 4 / 6

Etkileşimli

Zihinsel model

Bu problem için animasyonlu çözüm. Adımları kaydır veya boşlukla duraklat; değişmezi yüksek sesle yeniden anlat.

Adım 1 / 6
4A18join455B61

İki liste kuyruğu 8'den paylaşır. İkisini yürü; null'da diğer head'e atla.

Demo önizleme: Bu çözümler otomatik test paketini geçiyor ama insan tarafından incelenmedi. Trade-off ve yazıları taslak olarak değerlendirin.

Intersection of Two Linked Lists

Problem (yeniden ifade)

İki tek yönlü bağlı listenin kesişim düğümünü döndür; yoksa null.

Sezgi

Bir işaretçi bitince diğer listenin head’ine atla. Mesafeler kesişimde eşitlenir.

Yaklaşımlar

Two-pointer head değiştirme

Doğrulanmadı
Zaman O(m+n)Alan O(1)

Fikir. a ve b’yi ilerlet; null → head değiştir; a == b olunca dur.

Yürüyüş. Uzunluğu c olan ortak kuyruk: ikisi a+c+b adım sonra buluşur.

Trade-off. A listesinin hash kümesi daha basit, O(m) bellek.

Çözüm
export class ListNode {
  val: number; next: ListNode | null;
  constructor(val = 0, next: ListNode | null = null) { this.val = val; this.next = next; }
}
export function getIntersectionNode(headA: ListNode | null, headB: ListNode | null): ListNode | null {
  if (!headA || !headB) return null;
  let a: ListNode | null = headA, b: ListNode | null = headB;
  while (a !== b) { a = a ? a.next : headB; b = b ? b.next : headA; }
  return a;
}
export class ListNode {
  val: number; next: ListNode | null;
  constructor(val = 0, next: ListNode | null = null) { this.val = val; this.next = next; }
}
export function getIntersectionNode(headA: ListNode | null, headB: ListNode | null): ListNode | null {
  if (!headA || !headB) return null;
  let a: ListNode | null = headA, b: ListNode | null = headB;
  while (a !== b) { a = a ? a.next : headB; b = b ? b.next : headA; }
  return a;
}

Şablon bağlantısı

Head değiştiren two pointers; yürüyüşler kesişimde eşitlenir (döngü tespiti ailesi).

Yansıma