Skip to content

0876. Middle of the Linked List

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:

img

Input: head = [1,2,3,4,5]
Output: [3,4,5]
Explanation: The middle node of the list is node 3.

Example 2:

img

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

Analysis

This question can be solved by two pointers: one pointer moves one step each turn and the other moves two steps, so when the fast pointer has reached to the end of the linkedlist, the slow pointer will be at the middle of the linkedlist. Since we want to return the second middle pointer from the linkedlist, we need to make sure the fast pointer is pointing to the next, which is null, of the last pointer.

  • Time: O(n / 2) or O(n)
  • Space: O(1)

Code

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* middleNode(ListNode* head) {
        ListNode *a = head, *b = head;
        while (b && b -> next) {
            a = a -> next;
            b = b -> next -> next;
        }
        return a;
    }
};

Last update: April 1, 2022