• 141. Linked List Cycle


    Problem statement

    Given a linked list, determine if it has a cycle in it.

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

    Solution

    This is a classical problem in a linked list. It is chosen for interview by many high-tech companies.

    The generally idea is also a very good philosophy in linked list -->  Fast and slow pointers.

    • Define two pointers, fast and slow.
    • Each time fast goes two step and slow goes one step.
    • If there is a loop, they must met sometime.
    • Otherwise, fast will become NULL first.

    Time complexity is O(n), space complexity is O(1)

    The following solution follows the idea to find the middle of a link list. Fast pointer should goes faster than slow at start.

    /**
     * Definition for singly-linked list.
     * struct ListNode {
     *     int val;
     *     ListNode *next;
     *     ListNode(int x) : val(x), next(NULL) {}
     * };
     */
    class Solution {
    public:
        bool hasCycle(ListNode *head) {
            if(head == NULL){
                return false;
            }
            ListNode* fast = head->next;
            ListNode* slow = head;
            while(fast != NULL && fast->next != NULL){
                if(fast == slow){
                    return true;
                }
                fast = fast->next->next;
                slow = slow->next;
            }
            return false;
        }
    };

    This solution do not need to do the test at beginning of the program, however, fast is initialized the same value of slow.

    /**
     * Definition for singly-linked list.
     * struct ListNode {
     *     int val;
     *     ListNode *next;
     *     ListNode(int x) : val(x), next(NULL) {}
     * };
     */
    class Solution {
    public:
        bool hasCycle(ListNode *head) {
            ListNode* fast = head;
            ListNode* slow = head;
            while(fast != NULL && fast->next != NULL){
                fast = fast->next->next;
                slow = slow->next;
                if(fast == slow){
                    return true;
                }
            }
            return false;
        }
    };
  • 相关阅读:
    日常记Bug
    Docker部署Django
    杂记:防火墙、企业微信登陆、RestFrameWork
    Python2和Python3的编码
    杂记:Django和static,Nginx配置路径,json_schema
    xlwt模块的使用
    企业微信登陆
    markdown八条基础语法
    webstorm 添加markdown支持
    【electron系列之二】复制图片
  • 原文地址:https://www.cnblogs.com/wdw828/p/7016780.html
Copyright © 2020-2023  润新知