两种思路
第一种:借助 外部容器 HashMap 但是对于这道题的时间复杂度过不了。
第二种:使用快慢指针找到链表中点,断开,翻转后半部分链表形成两个链表,最后交叉合并两个链表即可

/**
 * Definition for singly-linked list.
 * class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) {
 *         val = x;
 *         next = null;
 *     }
 * }
 */
import java.util.*;
public class Solution {

    public HashMap<Integer,ListNode> map=new HashMap<>();
    //逆序后半部分链表,然后拼接
    public void reorderList(ListNode head) {

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

        ListNode slow=head;
        ListNode fast=head.next;
        while(fast!=null&&fast.next!=null){
            slow=slow.next;
            fast=fast.next.next;
        }
        ListNode cur=slow;
        //逆序后半部分链表
        ListNode pre=null;
        while(cur!=null){
            ListNode next=cur.next;
            cur.next=pre;
            pre=cur;
            cur=next;
        }
        ListNode index=head;
        while(index!=null&&pre!=null){
            ListNode indexNext=index.next;
            ListNode preNext=pre.next;
            index.next=pre;
            pre.next=indexNext;

            index=indexNext;
            pre=preNext;

        }

    }
    public void reorderListOld(ListNode head) {
        if(head==null||head.next==null||head.next.next==null){
            return;
        }
        ListNode index=head;
        int length=0;
        while(index!=null){
            map.put(length++,index);
            index=index.next;
        }
        length-=1;
        for(int i=0;i<length;i++){
            if(map.get(length-i)==null){
                return;
            }
            map.get(i).next=map.get(length-i);
            map.get(length-i).next=map.get(i+1);
        }
    }
}