Skip to main content

Middle of the Linked List

Problem

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

Solution

/**
* Definition for singly-linked list.
* function ListNode(val, next) {
* this.val = (val===undefined ? 0 : val)
* this.next = (next===undefined ? null : next)
* }
*/
/**
* @param {ListNode} head
* @return {ListNode}
*/
var middleNode = function(head) {
let slow = head;
let fast = head;

while (fast?.next) {
fast = fast.next?.next;
slow = slow.next;
}
return slow;
};

We will use a fast pointer fast, and a slow pointer slow, to find the middle of the linked list. More specifically, since fast moves at two nodes at a time and slow moves at one node at a time, when fast reaches the end of the list, slow should be exactly at the half way point of the list (or the second middle node if the list is even in length).