双指针解决问题

双指针是一种常见的算法技巧,主要用于解决一些数组或链表相关的问题。以下是几个常见的问题,可以使用双指针来解决:

  1. 链表中的两数之和:给定一个有序链表和一个目标值,在链表中找到两个数,使它们的和等于目标值。双指针可以同时从链表的头部和尾部开始向中间移动,通过比较当前两个指针所指节点的值与目标值的大小关系,进行逐步逼近。

  2. 有序数组的两数之和:给定一个有序数组和一个目标值,在数组中找到两个数,使它们的和等于目标值。可以使用双指针,一个指向数组的起始位置,一个指向数组的末尾位置,根据当前两个指针所指元素的和与目标值的大小关系,逐步逼近目标值。

  3. 判断链表是否有环:使用快慢指针,快指针每次移动两步,慢指针每次移动一步,如果存在环,快指针最终会追上慢指针,即两个指针会相遇。这是因为在有环的情况下,快指针相当于在环上绕了一圈,追上了慢指针。

  4. 寻找链表的中间节点:使用快慢指针,快指针每次移动两步,慢指针每次移动一步,当快指针到达链表末尾时,慢指针指向的节点即为链表的中间节点。

  5. 数组去重:对于已排序的数组,可以使用两个指针,一个指向当前要保留的元素位置,另一个指向当前遍历到的元素位置,通过比较两个指针指向的元素是否相等,实现去重的目的。

    6.找倒数第k个节点

这种方法的思路是通过让快指针先移动k个位置,然后再同时移动两个指针,保持它们之间的距离为k,当快指针到达链表末尾时,慢指针所指的位置就是倒数第k个节点。然后同时移动快指针和慢指针,直到快指针达到链表的末尾。这样,慢指针所指的节点就是倒数第k个节点。

  1. 链表中的两数之和:给定一个有序链表和一个目标值,在链表中找到两个数,使它们的和等于目标值。双指针可以同时从链表的头部和尾部开始向中间移动,通过比较当前两个指针所指节点的值与目标值的大小关系,进行逐步逼近。

  2. 有序数组的两数之和:给定一个有序数组和一个目标值,在数组中找到两个数,使它们的和等于目标值。可以使用双指针,一个指向数组的起始位置,一个指向数组的末尾位置,根据当前两个指针所指元素的和与目标值的大小关系,逐步逼近目标值。

  3. 判断链表是否有环:使用快慢指针,快指针每次移动两步,慢指针每次移动一步,如果存在环,快指针最终会追上慢指针,即两个指针会相遇。这是因为在有环的情况下,快指针相当于在环上绕了一圈,追上了慢指针。

  4. 寻找链表的中间节点:使用快慢指针,快指针每次移动两步,慢指针每次移动一步,当快指针到达链表末尾时,慢指针指向的节点即为链表的中间节点。

  5. 数组去重:对于已排序的数组,可以使用两个指针,一个指向当前要保留的元素位置,另一个指向当前遍历到的元素位置,通过比较两个指针指向的元素是否相等,实现去重的目的。

  6. 找倒数第k个节点创建两个指针,分别称为快指针和慢指针。将快指针指向链表的头节点,并让快指针先向前移动k个位置。

def findKthFromEnd(head, k):
    slow = fast = head
    # 先将快指针移动到第k个节点处
    for _ in range(k):
        if fast is None:
            return None  # 处理链表长度小于k的情况
        fast = fast.next
    # 同时移动快指针和慢指针,直到快指针达到链表末尾
    while fast is not None:
        fast = fast.next
        slow = slow.next
    return slow

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值