zoukankan      html  css  js  c++  java
  • 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;
        }
    };
  • 相关阅读:
    Tkinter之Label部件
    Tkinter编码风格
    GUI之tkinter视窗设计模块
    绘制函数图像
    backbone学习总结(一)
    实习两个月,写在辞职的今天
    Spark SQL 编程初级实践2- 编程实现利用 DataFrame 读写 MySQL 的数据
    Spark SQL 编程初级实践1-Spark SQL 基本操作
    spark创建DataFrame的几种方式
    python-with open() as file相关参数以及常用打开方式
  • 原文地址:https://www.cnblogs.com/wdw828/p/7016780.html
Copyright © 2011-2022 走看看