leetcode-141. 環形鏈表

141. 環形鏈表

一、題目描述

給定一個鏈表,判斷鏈表中是否有環。測試

爲了表示給定鏈表中的環,咱們使用整數 pos 來表示鏈表尾鏈接到鏈表中的位置(索引從 0 開始)。 若是 pos 是 -1,則在該鏈表中沒有環。3d

試題連接:https://leetcode-cn.com/problems/linked-list-cycle/指針

二、先來介紹三種奇葩的作法

2.一、判定鏈表長度不超過10000

public static boolean hasCycle(ListNode head) {
        //定義末尾指針,指向尾部
        ListNode p2 = head;
        int size = 1;
        while (p2 != null) {
            p2 = p2.next;
            size++;
            if(size > 10_000) {
                return true;
            }
        }
        return false;
    }

測試結果:code

2.二、判定遍歷時間不超過1ms

public static boolean hasCycle(ListNode head) {
        //定義末尾指針,指向尾部
        ListNode p2 = head;
        long start = System.currentTimeMillis();
        while (p2 != null) {
            p2 = p2.next;
            if(System.currentTimeMillis() - start > 1) {
                return true;
            }
        }
        return false;
    }

測試結果:blog

2.三、判定鏈表中沒有-1000000000的數字

public static boolean hasCycle(ListNode head) {
        //定義末尾指針,指向尾部
        ListNode p2 = head;
        while (p2 != null) {
            if(p2.val == -1000000000) {
                return true;
            }
            p2.val = -1000000000;
            p2 = p2.next;
        }
        return false;
    }

測試結果:索引

三、快慢指針法

3.一、java語言實現

public static boolean hasCycle(ListNode head) {
        if(head == null || head.next == null)
            return false;

        //快慢指針法
        ListNode p1 = head;     //快指針
        ListNode p2 = head;     //慢指針

        while(p1 != null && p2 != null && p1.next != null) {
            p1 = p1.next;

            if(p1 == p2) {
                return true;
            }
            p2 = p2.next;
            p1 = p1.next;
        }
        return false;
    }

測試結果:leetcode

3.二、C語言實現

bool hasCycle(struct ListNode *head) {
    if(head == NULL || head->next == NULL)
        return false;

    //快慢指針法
    struct ListNode* p1 = head;     //快指針
    struct ListNode* p2 = head;     //慢指針

    while(p1 != NULL && p2 != NULL && p1->next != NULL) {
        p1 = p1->next;

        if(p1 == p2) {
            return true;
        }
        p2 = p2->next;
        p1 = p1->next;
    }
    return false;
}

測試結果:get

相關文章
相關標籤/搜索