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