zoukankan      html  css  js  c++  java
  • LeetCode Linked List Cycle II

    Problem Description

    Given a linked list, return the node where the cycle begins. If there is no cycle, return null.

    Follow up:
    Can you solve it without using extra space?

    Problem Solution


    Note: 假设循环结点与头结点之间路径长度为k,链表结点长度为n

    1. 定义两个指针同时遍历链表,一个步阶为1,另一个步阶为2

    2. 两指针相遇时应满足的条件:

      1) 2p1=p2 (p1: 步阶为1指针所走结点路径长度,p2:步阶为2指针所走结点路径长度)  

     2) p2-p1 = (n - k)的倍数

     由两式可推导得到:p1 = (n - k) 的倍数。

    3. 第一次相遇是在步阶为1指针走了 n - k 步之后,这时,让步阶为1指针回到头结点的位置,步阶为2结点保持在相遇的结点,它们距离循环结点的距离都为 k ,然后以步阶为1进度遍历链表,再次相遇点即为循环结点位置。

    /**
     * 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) {
            if(head==NULL || head->next==NULL)
                return NULL;
            ListNode *p,*q;
            p=q=head;
            
            while(p && p->next)
            {
                q=q->next;
                p=p->next->next;
                if(p==q)
                    break;
            }
            if(p==NULL || p->next==NULL)
                return NULL;
            q=head;
            while(q!=p)
            {
                q=q->next;
                p=p->next;
            }
            return p;
        }
    };
  • 相关阅读:
    《20170914-构建之法:现代软件工程-阅读笔记》
    《结对-贪吃蛇游戏-开发环境搭建过程》
    《结对-贪吃蛇游戏-设计文档》
    《自我介绍》
    对于软件工程的期望
    GIT的使用方法
    结对-贪吃蛇-需求分析
    团队-井字棋-需求分析
    团队-井字棋-成员简介及分工
    新的目标
  • 原文地址:https://www.cnblogs.com/ballwql/p/3676843.html
Copyright © 2011-2022 走看看