--- tags: data_structure_python ---# Middle of the Linked List <img src="https://img.shields.io/badge/-easy-brightgreen"> Given a non-empty, singly linked list with head node head, return a middle node of linked list. If there are two middle nodes, return the second middle node. <ins>**Example 1**:</ins> ``` Input: [1,2,3,4,5] Output: Node 3 from this list (Serialization: [3,4,5]) The returned node has value 3. (The judge's serialization of this node is [3,4,5]). Note that we returned a ListNode object ans, such that: ans.val = 3, ans.next.val = 4, ans.next.next.val = 5, and ans.next.next.next = NULL. ``` <ins>**Example 2**:</ins> ``` Input: [1,2,3,4,5,6] Output: Node 4 from this list (Serialization: [4,5,6]) Since the list has two middle nodes with values 3 and 4, we return the second one. ``` **Note:** - The number of nodes in the given list will be between 1 and 100. # Solution ### Solution 1: First approach ```python= # Definition for singly-linked list. class ListNode: def __init__(self, x): self.val = x self.next = None class Solution: def middleNode(self, head: ListNode) -> ListNode: # O(n) time complexity. # O(1) space complexity. count = 0 pointer2 = head while pointer2 != None: count += 1 pointer2 = pointer2.next mid = count//2 while mid > 0: head = head.next mid -= 1 return head ``` ### Solution 2: Second approach (Two pointers) ```python= # Definition for singly-linked list. class ListNode: def __init__(self, x): self.val = x self.next = None class Solution: def middleNode(self, head: ListNode) -> ListNode: fast = head slow = head while fast and fast.next: fast, slow = fast.next.next, slow.next return slow ```