Java solution with 3 steps
  public class Solution {\n        \n        public void reorderList(ListNode head) {\n          if (head == null || head.next == null)\n              return;\n
      public class Solution {\n        \n        public void reorderList(ListNode head) {\n          if (head == null || head.next == null)\n              return;\n          \n          // step 1. cut the list to two halves\n          // prev will be the tail of 1st half\n          // slow will be the head of 2nd half\n          ListNode prev = null, slow = head, fast = head, l1 = head;\n          \n          while (fast != null && fast.next != null) {\n            prev = slow;\n            slow = slow.next;\n            fast = fast.next.next;\n          }\n          \n          prev.next = null;\n          \n          // step 2. reverse the 2nd half\n          ListNode l2 = reverse(slow);\n          \n          // step 3. merge the two halves\n          merge(l1, l2);\n        }\n        \n        ListNode reverse(ListNode head) {\n          ListNode prev = null, curr = head, 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        \n        void merge(ListNode l1, ListNode l2) {\n          while (l1 != null) {\n            ListNode n1 = l1.next, n2 = l2.next;\n            l1.next = l2;\n            \n            if (n1 == null)\n              break;\n                \n            l2.next = n1;\n            l1 = n1;\n            l2 = n2;\n          }\n        }\n    \n      }
['Java']