zoukankan      html  css  js  c++  java
  • leetcode 142. 环形链表 II 2

    思路

    两次循环,第一次循环是快慢指针,若链表不是环形,则快指针先到表尾NULL,若是环形,快慢指针会相遇。相遇后将快慢指针之一置到表头head,然后开始第二次循环,此时快慢指针同速移动。当快慢指针再次相遇时到达链表开始入环的第一个节点。

    代码

    /**
     * Definition for singly-linked list.
     * struct ListNode {
     *     int val;
     *     ListNode *next;
     *     ListNode(int x) : val(x), next(NULL) {}
     * };
     */
    class Solution {
    public:
        ListNode *detectCycle(ListNode *head) {
            ListNode *slow = head;// 定义两个指针,一个快指针,一个慢指针,都从头开始
            ListNode * fast = head;
            while(fast!=NULL&& fast->next!=NULL)
            {
                fast=fast->next->next;//快指针每次跑两步
                slow = slow->next;//慢指针每次跑一步
                if(slow==fast)//第一次相遇,则
                {
                        fast = head;//快指针从头开始运动 直到两个指针第二次相遇  则为入口环的节点
                        while(fast!=slow)
                        {
                            fast= fast->next;
                            slow = slow->next;
                        }
                        return fast;
                        break;
                }
            }
            return NULL;
        }
    };
    以大多数人努力程度之低,根本轮不到去拼天赋~
  • 相关阅读:
    CSS基础
    数据库优化之SQL Server
    压力测试与系统调优
    JBoss架构分析
    JBoss基本配置
    深入了解硬盘结构
    EJB2与EJB3架构对比
    JBoss高级配置
    病毒分类及病毒命名规则详解
    深入讲解防火墙的概念原理与实现
  • 原文地址:https://www.cnblogs.com/gcter/p/15338718.html
Copyright © 2011-2022 走看看