题目
给你单链表的头结点 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
解题
方法一:双指针
思路
- 首先,在定义
Solution
类时,middleNode
方法接收一个名为head
的可选的ListNode
参数,并且返回一个可选的ListNode
。 - 在方法内部,定义两个指针
slow
和fast
,初始时都指向头节点head
。 - 使用循环遍历来寻找链表的中间节点,循环条件为
while fast and fast.next:
表示只要fast
指针和fast.next
指针都不为空,就执行循环体内的代码。在每次迭代中,执行以下操作:- 将
slow
指针移动一步,即slow = slow.next
,代表慢指针每次移动一个节点。 - 将
fast
指针移动两步,即fast = fast.next.next
,代表快指针每次移动两个节点。 - 这样,当快指针到达链表末尾时,慢指针正好指向链表的中间节点。
- 将
- 循环结束后,返回慢指针
slow
所指向的节点作为结果。
代码
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
def middleNode(self, head: Optional[ListNode]) -> Optional[ListNode]:
slow = head
fast = head
while fast and fast.next:
slow = slow.next
fast = fast.next.next
return slow