Intuitive JavaScript Solution
\n/**\n * Definition for singly-linked list.\n * function ListNode(val) {\n *     this.val = val;\n *     this.next = null;\n * }\n */\n/**\n * @param {ListNode
```\n/**\n * Definition for singly-linked list.\n * function ListNode(val) {\n *     this.val = val;\n *     this.next = null;\n * }\n */\n/**\n * @param {ListNode} head\n * @return {void} Do not return anything, modify head in-place instead.\n */\nvar reorderList = function(head) {\n  if (head === null) {\n    return;\n  }\n  /**\n   * The goal is to reverse the second half of the list and merge it onto\n   * the first half of the list. The first half will have at most one more\n   * element than the second half.\n   */\n  let second = split(head);\n  second = reverse(second);\n  merge(head, second);\n};\n\nfunction split(node) {\n  let fast = node;\n  let slow = node;\n  \n  while (fast !== null) {\n    if (fast.next !== null && fast.next.next !== null) {\n      slow = slow.next;\n      fast = fast.next.next;\n    } else {\n      fast = null;\n    }\n  }\n  \n  const secondHalf = slow.next;\n  slow.next = null;\n  \n  return secondHalf;\n}\n\nfunction reverse(node) {\n  let curr = node;\n  let prev = null;\n  let next = null;\n  \n  while (curr !== null) {\n    next = curr.next;\n    curr.next = prev;\n    prev = curr;\n    curr = next;\n  }\n  \n  return prev;\n}\n\nfunction merge (l1, l2) {\n  let l1Next = null;\n  let l2Next = null;\n  \n  while(l2 !== null) {\n    l1Next = l1.next;\n    l2Next = l2.next;\n    \n    l1.next = l2;\n    l2.next = l1Next;\n    \n    l1 = l1Next;\n    l2 = l2Next;\n  }\n}\n```
['Iterator', 'JavaScript']