算法复习:双指针(对撞指针快慢指针)

Posted dzzy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法复习:双指针(对撞指针快慢指针)相关的知识,希望对你有一定的参考价值。

一、快慢指针: leedcode 142. 环形链表 II

快慢指针的思想是设置慢指针slow和快指针fast,slow每次走一步,fast每次走两步,如果有环fast指针和slow指针必然相遇,相遇时

定义新的指针p从head开始和slow从当前位置起每次都走一步,直到相遇,相遇的位置就是环的入口。

技术图片
class Solution {
public:
    ListNode *detectCycle(ListNode *head)
    {
        int lable=0;
        struct ListNode *slow,*fast,*pp;
        if(head==NULL)
            return NULL;
        if(head->next==NULL)
            return NULL;
        slow=head->next;
        if(slow->next==NULL)
            return NULL;
        fast=slow->next;
        while(slow!=fast)// 步骤一:使用快慢指针判断链表是否有环
        {
            if(fast->next==NULL)
            {
                lable=1;
                break;
            }
            fast=fast->next;//快指针走两步
            if(fast->next==NULL)
            {
                lable=1;
                break;
            }
            fast=fast->next;
            slow=slow->next;//慢指针走一步
        }
        if(lable==1)
            return NULL;
        pp=head;
        while(pp!=slow)// 步骤二:若有环,找到入环开始的节点
        {
            pp=pp->next;
            slow=slow->next;
        }
        return pp;
    }
};
leedcode 142

 

以上是关于算法复习:双指针(对撞指针快慢指针)的主要内容,如果未能解决你的问题,请参考以下文章

双指针的快慢指针和对撞指针

双指针问题复习

算法模板-双指针

算法模板-双指针

Java版算法思想双指针算法

Java版算法思想双指针算法