演算法141. 環形連結串列

orastar發表於2020-05-25

1. 題目描述

給定一個連結串列,判斷連結串列中是否有環。

為了表示給定連結串列中的環,我們使用整數 pos 來表示連結串列尾連線到連結串列中的位置(索引從 0 開始)。 如果 pos 是 -1,則在該連結串列中沒有環。

示例 1:

輸入:head = [3,2,0,-4], pos = 1
輸出:true
解釋:連結串列中有一個環,其尾部連線到第二個節點。

示例 2:

輸入:head = [1,2], pos = 0
輸出:true
解釋:連結串列中有一個環,其尾部連線到第一個節點。

示例 3:

輸入:head = [1], pos = -1
輸出:false
解釋:連結串列中沒有環。

進階:

你能用 O(1)(即,常量)記憶體解決此問題嗎?

來源:力扣(LeetCode)
連結: https://leetcode-cn.com/problems/linked-list-cycle

2. 解題思路

/*
解題思路:
解法一、雙指標法
1、設定一個快指標fast:一次走兩步
2、設定一個慢指標slow:一次走一步
3、如果存在環連結串列,則fast和slow會重合
4、否則不存在環連結串列
*/

3. 測試結果

解法一、雙指標法

4. C版

/*
title: 演算法141. 環形連結串列
author: xidoublestar
method: 雙指標法
type: C
date: 2020-5-25
*/
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
bool hasCycle(struct ListNode* head) {
    if (head == NULL)
        return false;
    struct ListNode* fast = head->next, * slow = head;
    while (fast && fast->next) {
        fast = fast->next->next;
        slow = slow->next;
        if (fast == slow)
            return true;
    }
    return false;
}

6. 複雜度分析

解法一、雙指標法
時間複雜度:O(n)
空間複雜度:O(1)

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31442014/viewspace-2694288/,如需轉載,請註明出處,否則將追究法律責任。

相關文章