Another warm-up question from the archives.
The editorial solution, fast-and-slow-pointer, is very cute. I’m not sure how it’s preferable over separating the length (“fast”) calculation from the actual-find-calculation (“slow”). We’re doing the same traversals, but presumably with better locality?
class Solution:
def middleNode(self, head: Optional[ListNode]) -> Optional[ListNode]:
l = 0
n = head
while n is not None:
n = n.next
l += 1
n = head
for i in range(l//2):
n = n.next
return n