Accepted Answer in Java
/**\n     * Definition for singly-linked list.\n     * class ListNode {\n     *     int val;\n     *     ListNode next;\n     *     ListNode(int x) {\n     *   
    /**\n     * Definition for singly-linked list.\n     * class ListNode {\n     *     int val;\n     *     ListNode next;\n     *     ListNode(int x) {\n     *         val = x;\n     *         next = null;\n     *     }\n     * }\n     */\n    public class Solution {\n        \n        private ListNode start;\n        \n        public void reorderList(ListNode head) {\n            \n            // 1. find the middle point\n            if(head == null || head.next == null || head.next.next == null)return;\n    \n            ListNode a1 = head, a2 = head;\n            \n            while(a2.next!=null){\n                // a1 step = 1\n                a1 = a1.next;\n                // a2 step = 2\n                a2 = a2.next;\n                if(a2.next==null)break;\n                else a2 = a2.next;\n            }\n            // a1 now points to middle, a2 points to last elem\n    \n            // 2. reverse the second half of the list\n            this.reverseList(a1);\n    \n            // 3. merge two lists\n            ListNode p = head, t1 = head, t2 = head;\n            while(a2!=a1){ // start from both side of the list. when a1, a2 meet, the merge finishes.\n                t1 = p;\n                t2 = a2;\n                p = p.next;\n                a2 = a2.next;\n                \n                t2.next = t1.next;\n                t1.next = t2;\n            }\n        }\n        \n        // use recursion to reverse the right part of the list\n        private ListNode reverseList(ListNode n){\n            \n            if(n.next == null){\n                // mark the last node\n                // this.start = n;\n                return n;\n            }\n            \n            reverseList(n.next).next = n;\n            n.next = null;\n            return n;\n        }\n    }
['Java']