LeetCode:链表的中间结点
1、题目描述
给你单链表的头结点 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
2、解题思路--快慢指针
使用快慢指针(Fast-Slow Pointer)来找到链表的中间节点:
-
快指针(fast):每次移动 两步(
fast = fast.next.next
)。 -
慢指针(slow):每次移动 一步(
slow = slow.next
)。
当快指针到达链表末尾时,慢指针正好指向链表的中间节点。
关键点
-
循环条件:
-
while (fast != null && fast.next != null)
-
fast != null
:确保快指针没有越界(适用于奇数长度链表)。 -
fast.next != null
:确保快指针可以移动两步(适用于偶数长度链表)。
-
-
-
奇数长度链表:
-
链表长度为奇数时,快指针最终会指向最后一个节点(
fast.next == null
),此时慢指针正好指向中间节点。 -
例如:
1 -> 2 -> 3 -> 4 -> 5
,慢指针指向3
。
-
-
偶数长度链表:
-
链表长度为偶数时,快指针最终会指向
null
(因为fast.next.next
会越界),此时慢指针指向第二个中间节点(题目通常要求返回第二个中间节点)。 -
例如:
1 -> 2 -> 3 -> 4
,慢指针指向3
(第二个中间节点)。
-
public static ListNode middleNode(ListNode head) {ListNode fast = head, slow = head;while (fast != null && fast.next != null) {fast = fast.next.next; // 快指针每次走两步slow = slow.next; // 慢指针每次走一步}return slow; // 慢指针指向中间节点
}
时间复杂度
-
O(n),其中
n
是链表的长度。 -
快指针遍历链表约
n/2
次,慢指针移动n/2
次,因此总的时间复杂度是线性的。