题目描述
876. 链表的中间结点
解法一:链表变数组(C++)
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];
}
};
解法二:快慢指针(C++)
- 初始时两个指针均指向头指针。
- 如果快指针为空或者快指针的next为空,那么此时慢指针即为答案,移动结束。
- 每轮移动,快指针需要移动两次,慢指针需要移动一次。跳转步骤二。
C++ 图解证明快慢指针 上次鹅场面试还遇到过 :)
class Solution {
public:
ListNode* middleNode(ListNode* head) {
ListNode *p = head, *q = head;
while(q!=nullptr && q->next!=nullptr)
{
p = p->next;
q = q->next->next;
}
return p;
}
};