Udemy pragmatic-system-design
2026/1/17 11:00:45
给你单链表的头结点head,请你找出并返回链表的中间结点。
如果有两个中间结点,则返回第二个中间结点。
示例 1:
输入:head = [1,2,3,4,5]输出:[3,4,5]解释:链表只有一个中间结点,值为 3 。
示例 2:
输入:head = [1,2,3,4,5,6]输出:[4,5,6]解释:该链表有两个中间结点,值分别为 3 和 4 ,返回第二个结点。
提示:
[1, 100]1 <= Node.val <= 100这段代码的核心功能是找到单链表的中间节点(若链表节点数为偶数,返回第二个中间节点;奇数则返回正中间节点),采用「快慢指针(龟兔赛跑)」的经典方法实现,时间复杂度O(n)、空间复杂度O(1),是找链表中间节点的最优解法。
代码利用快慢指针的步长差异,让快指针走得更快,当快指针到达链表末尾时,慢指针恰好停在中间位置:
low和快指针fast都从链表头节点head出发;fast不为空且fast->next不为空(保证快指针能走两步):low每次走 1 步(low = low->next);fast每次走 2 步(fast = fast->next->next);low即可。fast && fast->next避免快指针访问空指针的next导致崩溃;/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), next(nullptr) {} * ListNode(int x) : val(x), next(nullptr) {} * ListNode(int x, ListNode *next) : val(x), next(next) {} * }; */ class Solution { public: ListNode* middleNode(ListNode* head) { ListNode* low=head; ListNode* fast=head; while(fast && fast->next){ low=low->next; fast=fast->next->next; } return low; } };