1. 程式人生 > >LeetCode.876. Middle of the Linked List

LeetCode.876. Middle of the Linked List

題目的大意為找尋LinkedList的中間節點,如果有兩個中間節點,返回第二個中間節點。

比如:

輸入:[1,2,3,4,5]
輸出:此列表中的結點 3 (序列化形式:[3,4,5])

或者:

輸入:[1,2,3,4,5,6]
輸出:此列表中的結點 4 (序列化形式:[4,5,6])

拿到這道題,我首先想到先獲取連結串列長度,再取中間值,去查詢節點。

程式碼實現為:

public ListNode middleNode(ListNode head) {

        int length = 1;
        ListNode temp = head;
        while (temp.next != null) {
            length++;
            temp = temp.next;
        }

        int middle = length / 2;
        for (int i = 0; i <= middle; i++) {
            if (i == middle) {
                return head;
            }
            head = head.next;
        }
        return null;
}

執行通過後,查詢其他大神們提交的程式碼,發現還有一種結題方式比較好:

    public ListNode middleNode(ListNode head) {

        ListNode fast  = head,slow = head;
        while(fast!=null&& fast.next !=null){
            fast = fast.next.next;
            slow = slow.next;
        }
        return slow;
    }

一種類似於龜兔賽跑的方式,fast節點每次走兩步,slow節點每次走一步,當fast節點走到終點的時候,slow節點正好走一半,真是妙,學習了。

希望有一天我也能成為大神,加油。