2ms Recursive Java Solution
\nclass Solution {\n    public void reorderList(ListNode head) {\n        if (head == null) {\n            return;\n        }\n        \n        tail(head, head
```\nclass Solution {\n    public void reorderList(ListNode head) {\n        if (head == null) {\n            return;\n        }\n        \n        tail(head, head);        \n    }\n    \n    // Performs tail end recursion. Starts inserting nodes into the first half once we find the end. \n    private ListNode tail(ListNode head, ListNode curr) {\n        // Recurse until we find the tail\n        if (curr.next != null) {\n            head = tail(head, curr.next);\n        }\n        \n        // Insertions complete. Stop\n        if (head == null) {\n            return null;\n        }\n\n        ListNode second = head.next;\n        \n        // Check to see if we\'ve reached the end of the new merged linked list\n        if (head == curr || curr == second) {\n            // Make sure to terminate the linked list\n            curr.next = null;\n            return null;\n        }\n        \n        // Insert node from end (curr) between head and second\n        // head -> curr -> second\n        head.next = curr; \n        curr.next = second;\n        \n        // Return where the next insertion should begin\n        return second;\n    }\n}\n```
[]