Concise recursive O(N) solution with O(1) space, easy to understand
class Solution {\n    public:\n        void reorderList(ListNode* head) {\n            ListNode* temp = head;\n            helper(temp, head);\n    }\n    \n   
    class Solution {\n    public:\n        void reorderList(ListNode* head) {\n            ListNode* temp = head;\n            helper(temp, head);\n    }\n    \n    private:\n    bool helper(ListNode*& head, ListNode* node) {\n        if (!node) {                       // Find the last node\n            return false;\n        }\n        if (helper(head, node->next)) {   // Stop recursion if mid point has met\n            return true;\n        }\n        if (node == head || node == head->next) {  // Change newEnd->next to NULL and tell the function to stop\n            node->next = NULL;\n            return true;\n        }\n        ListNode *temp = head;\n        head = head->next;\n        temp->next = node;\n        node->next = head;\n        \n        return false;  // Ask the function to continue\n    }\n    };\n\nThe idea is quite simple here. First we use recursion to find the last node then start doing the reordering. The tricky part is how to tell the function to stop when the mid point has met. Here I simply modify this function to return a boolean value, the returned value is whether this function should stop.\n\nHope this could help you a little bit. :)
[]