一.原题如下
二.解题思路
- 这道题的解决方法是使用快慢指针(即相对而行),同时指向头节点
- 快指针走两步,慢指针走一步,直到快指针走到尽头,慢指针即为中间节点
- 需要注意的是,如果是偶数链表,这种方式指向的中间节点是靠后的那一个节点
三.复杂度
- 时间复杂度:O(n)
- 空间复杂度:O(1)
四.完整题解
具体步骤请查看每个关键步骤的代码注释
class Solution {
public ListNode middleNode(ListNode head) {
// 定义快慢指针
ListNode slow = head, fast = head;
// 慢指针走一步,快指针两步,当快指针走到尽头时,慢指针即为中间节点
while (fast != null && fast.next != null) {
slow = slow.next;
fast = fast.next.next;
}
// 返回慢指针,即中间节点
return slow;
}
}