使用快慢指针先找到链表的中间节点,如果链表的节点数量是奇数个,那就是正中间那个节点;如果链表的节点数量是偶数个,那么中间节点就是偏左的那个。
中间节点找到以后,将中间节点右边的那部分链表和原链表断开,采用头插法将这部分链表逆置,然后再同时从左往右的遍历这两个部分的链表,进行节点的插入。
时间复杂度为O(n)

    public void reorderList(ListNode head) {

        if (head == null || head.next == null){
            return;
        }

        ListNode p = head;
        ListNode q = head.next;

        while (q!= null && q.next != null){
            q = q.next.next;
            p = p.next;
        }

        ListNode lastHead = new ListNode(-1);
        ListNode firstPart = p;
        p = p.next;
        firstPart.next = null;

        while (p != null){

            ListNode pre_p = p;
            p = p.next;
            pre_p.next = lastHead.next;
            lastHead.next = pre_p;
        }

        q = head;
        p = lastHead.next;

        while (p != null){

            ListNode pre_p = p;
            p = p.next;

            pre_p.next = q.next;
            q.next = pre_p;
            q = pre_p.next;
        }

    }