Given the head of a singly linked list, return the middle node of the linked list.
If there are two middle nodes, return the second middle node.
Β
Example 1:
Input: head = [1,2,3,4,5]
Output: [3,4,5]
Explanation: The middle node of the list is node 3.
Example 2:
Input: head = [1,2,3,4,5,6]
Output: [4,5,6]
Explanation: Since the list has two middle nodes with values 3 and 4, we return the second one.
Β
Constraints:
The number of nodes in the list is in the range [1, 100].
1 <= Node.val <= 100
Solutions
Solution 1: Fast and Slow Pointers
We define two pointers \(\textit{fast}\) and \(\textit{slow}\), both initially pointing to the head of the linked list.
The fast pointer \(\textit{fast}\) moves two steps at a time, while the slow pointer \(\textit{slow}\) moves one step at a time. When the fast pointer reaches the end of the linked list, the node pointed to by the slow pointer is the middle node.
The time complexity is \(O(n)\), where \(n\) is the length of the linked list. The space complexity is \(O(1)\).
1 2 3 4 5 6 7 8 91011
# Definition for singly-linked list.# class ListNode:# def __init__(self, val=0, next=None):# self.val = val# self.next = nextclassSolution:defmiddleNode(self,head:ListNode)->ListNode:slow=fast=headwhilefastandfast.next:slow,fast=slow.next,fast.next.nextreturnslow
/** * Definition for singly-linked list. * type ListNode struct { * Val int * Next *ListNode * } */funcmiddleNode(head*ListNode)*ListNode{slow,fast:=head,headforfast!=nil&&fast.Next!=nil{slow,fast=slow.Next,fast.Next.Next}returnslow}