題目
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;
}
};