1. 程式人生 > >LeetCode141之環形連結串列(Java實現)

LeetCode141之環形連結串列(Java實現)

一、題目

 

二、兩種解題思路及程式碼實現

 ①龜兔賽跑解法,快指標跳兩個,慢指標跳一個,若兩指標遇到一樣,則有環

       時間複雜度:O(n)

       空間複雜度:O(1)

    /**
     * 龜兔賽跑解法 ---- 李小豪
     * @param head
     * @return
     */
    public boolean hasCycle1(ListNode head) {
        ListNode target1 = head;
        ListNode target2 = head;
        if (target1==null||target1.next == null || target1.next.next == null) {
            return Boolean.FALSE;
        }
        while (target2.next != target1.next.next) {
            target1 = target1.next.next;
            target2 = target2.next;
            if ( target1.next == null || target1.next.next == null) {
                return Boolean.FALSE;
            }
        }
        return Boolean.TRUE;
    }

 ②使用Set將走過的節點儲存起來,同時判斷是否存在走過相同節點,若存在則為環

       時間複雜度:O(n)

       空間複雜度:O(n)

    /**
     * 中間Set解法 ---- 李小豪
     * @param head
     * @return
     */
    public boolean hasCycle2(ListNode head) {
        Set<ListNode> listNodes=new LinkedHashSet<>();
        ListNode target=head;
        while(target.next!=null){
            if(listNodes.contains(target)){
                return Boolean.TRUE;
            }
            listNodes.add(target);
            target=target.next;
        }
        return Boolean.FALSE;
    }

三、基礎類

public class ListNode {
    public int val;
    public ListNode next;
    public ListNode(int x) {
        val = x;
        next = null;
    }
}

 

四、成功截圖

測試結果還行

五、個人目標

接下來幾個月將以前多學的Leetcode的題目在刷一遍,演算法再學一遍,加油,每天升一級,願未來努力繼續。