前言
本篇归纳双指针算法
- 快慢指针:主要是成环问题
- 左右指针:数组和字符串问题
- 滑动窗口:主要是子串问题
1、快慢指针
快慢指针
顾名思义
思路简单清晰
直接看下2个经典问题
链表是否有环
leet上141题
给定一个链表,判断链表中是否有环。
为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。
如果 pos 是 -1,则在该链表中没有环。
快慢指针
如果有环,迟早会相遇
class Solution:
def hasCycle(self, head: ListNode) -> bool:
fast, slow = head, head
while fast and fast.next:
fast = fast.next.next
slow = slow.next
if fast == slow: return True
return False
链表中有环,返回环的起始位置
leet上142题
给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。
为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。
如果 pos 是 -1,则在该链表中没有环。
说明:不允许修改给定的链表。
当快慢指针相遇时,让其中任⼀个指针指向头节点
然后让它俩以相同速度前进,再次相遇时所在的节点位置就是环开始的位置
class Solution:
def detectCycle(self, head: ListNode) -> ListNode:
fast, slow = head, head
while True:
if not (fast and fast.next): return
fast, slow = fast.next.next, slow.next
if fast == slow: break