题目表述:
问题分析:
- 暴力
首先计算链表的长度,然后计算中间位置的下标,再重新开始遍历链表到指定下标返回。 - 借助容器
借助容器可按下标返回的特点,将链表用容器存储,后直接按下标访问。 - 快慢指针
设置快,慢两个指针,快指针每次步长为两个结点,慢指针每次一个结点,当快指针到最后一个结点时慢指针刚好到链表中间。
完整代码:
//暴力解法
ListNode* middleNode(ListNode* head)
{
ListNode* t1 = head;
int index = 0;
// count length
while (t1)
{
t1 = t1->next;
index++;
}
//find node
index /= 2;
while (index--)
head = head->next;
return head;
}
//借助容器
ListNode* middleNode(ListNode* head)
{
vector<ListNode*> A = {head};
while (A.back()->next != NULL)
A.push_back(A.back()->next);
return A[A.size() / 2];
}
//快慢指针
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;
}
结果展示:(分别对应三个不同的算法)