Fast and Slow Pointers
📘 Fast and Slow Pointers (Floyd’s Tortoise and Hare Algorithm)
1. Lý thuyết cơ bản
1.1. Ý tưởng
Sử dụng 2 con trỏ duyệt qua dữ liệu:
Slow pointer (chậm): mỗi lần đi 1 bước.
Fast pointer (nhanh): mỗi lần đi 2 bước.
Khi duyệt:
Nếu Fast gặp Slow ⇒ có vòng lặp (cycle).
Nếu Fast tới null ⇒ không có vòng lặp.
Nếu dùng trong tìm middle node, khi Fast tới cuối, Slow sẽ nằm giữa.
1.2. Ứng dụng chính
Detect cycle trong Linked List (kiểm tra có vòng lặp không).
Find middle node trong Linked List.
Find cycle start node trong Linked List (nâng cao).
Find duplicate number in an array (bài toán LeetCode 287, biểu diễn array như một “linked list ảo”).
Một số bài toán về “meeting point” trong dãy số hoặc chu kỳ.
1.3. Ưu điểm
Time complexity: O(n)
Space complexity: O(1)
Không cần hash set hay visited array.
2. Ví dụ minh họa
🟢 2.1. Detect Cycle in Linked List
Java
Golang
🟢 2.2. Find Middle Node in Linked List
Java
Golang
🟢 2.3. Find Duplicate Number in Array (LeetCode 287)
Ý tưởng:
Dãy
numscón+1số trong phạm vi[1..n].Có ít nhất một số trùng lặp.
Xem mảng như linked list:
i → nums[i].
Sẽ có một “cycle” ⇒ dùng fast/slow tìm điểm gặp.
Java
Golang
3. Tổng kết
Fast & Slow Pointers = 2 con trỏ chạy với tốc độ khác nhau.
Công dụng: ✅ Tìm vòng lặp trong Linked List. ✅ Tìm node giữa trong Linked List. ✅ Tìm điểm bắt đầu của cycle. ✅ Giải bài toán tìm số trùng trong mảng.
Ưu điểm: chạy nhanh, không tốn thêm bộ nhớ.
Last updated