Easy to Understand Python Solution (Beat 98.65% Somehow)
The strategy I found most intuitive was to solve a few cases on paper as:\n\n[1] L = 1, Return 0th\n[1,2]  L = 2, Return 1st\n[1,2, 3]  L = 3, Return 1st\n[1,2,
The strategy I found most intuitive was to solve a few cases on paper as:\n\n[**1**] L = 1, Return 0th\n[1,**2**]  L = 2, Return 1st\n[1,**2**, 3]  L = 3, Return 1st\n[1,2, **3**, 4]  L = 4, Return 2nd\n[1,2, **3**, 4, 5]  L = 5, Return 2nd\n...\n[1,2, ..., k, **k + 1**, ..., 2k]  (Even length) Return kth \n[1,2, ..., k, **k + 1**, ..., 2k, 2k+1] (Odd length) Return kth\n\nA few patterns are immediately apparent. Whenever the length L is divisible by 2, the middle node must be advanced by one. So in the algorithm, we will: \n\n1. Initialize length  to 0 and middleNode to head\n2. Iterate through the ListNodes\n3. Increment length when exploring a new element\n4. Whenever the updated length is divisible by 2, the middle node will be advanced by one position\n5. Return the middle node\n\n```python\ndef middleNode(self, head: Optional[ListNode]) -> Optional[ListNode]:\n        middleNode = head\n        currentLength = 0\n        while head:\n            head = head.next\n            currentLength += 1\n            if currentLength % 2 == 0:\n                middleNode = middleNode.next\n        return middleNode\n```\n\nI thought this was a little more intuitive than the provided fast / slow pointer approach so just wanted to share.\nHope this helps!
['Two Pointers', 'Python']