leetcode 876.鏈表的中間結點

題目

https://leetcode-cn.com/problems/middle-of-the-linked-list/
簡單 鏈表

我的題解

先找出鏈表的長度length,然後中間結點就是length/2 + 1

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */


struct ListNode* middleNode(struct ListNode* head){
    struct ListNode *temp = head;
    int length = 0;
    while(temp)
    {
        length++;
        temp = temp->next;
    }
    int middle = length / 2 + 1;
    int i = 1;
    struct ListNode *ans = head;
    for(; i < middle; ++i)
    {
        ans = ans->next;
    }
    return ans;
}

題解

方法一:輸出到數組
按順序將每個結點放入數組 A 中。然後中間結點就是 A[A.Length/2],因爲我們可以通過索引檢索每個結點。

方法二:快慢指針法
當用慢指針 slow 遍歷列表時,讓另一個指針 fast 的速度是它的兩倍。當 fast 到達列表的末尾時,slow 必然位於中間。

solution 1
數組 T(n) = O(n) S(n) = O(n)

class Solution {
public:
    ListNode* middleNode(ListNode* head) {
        vector<ListNode*> A = {head};
        while (A.back()->next != NULL)
            A.push_back(A.back()->next);
        return A[A.size() / 2];
    }
};

solution 2
快慢指針 T(n) = O(n) S(n) = O(1)

class Solution {
public:
    ListNode* middleNode(ListNode* head) {
        ListNode* slow = head;
        ListNode* fast = head;
        while (fast != NULL && fast->next != NULL) {
            slow = slow->next;
            fast = fast->next->next;
        }
        return slow;
    }
};

總結

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章