解题思路分析:寻找链表中点 (快慢指针)+ 链表逆序 + 合并链表(插入前链表的每个节点之后)
class Solution {
public void reorderList(ListNode head) {
ListNode fast=head;
ListNode low=head;
//如果只有一个节点
if(fast.next==null||fast.next.next==null){
return;//直接结束运行
}
//寻找原链表的中间节点
while(fast.next!=null && fast.next.next!=null){
//终止的时候low恰好指向中间的节点
fast=fast.next.next;//每次走两步
low=low.next;
}
ListNode head2=low.next;//后半截链表的头结点
//将后半截链表逆序(创建一个新的链表,在头的下一个节点处添加节点)
ListNode temp=head2.next;
ListNode c=new ListNode();
ListNode dummy=new ListNode(0,head2);
dummy.next.next=null;//设置第一个节点的末尾为null
while(temp!=null){
c=temp.next;
temp.next=dummy.next;
dummy.next=temp;
temp=c;
}
head2=dummy.next;//真正的逆序链表的头结点
//将前半截的链表的末尾节点的下一个节点设置为null,断开连接(注意low在找到中点后一直没有重新赋值过)
low.next=null;//现在前半截的链表的头就是head
//将head2链表节点一个插入head链表中(为了节省内存重复使用前面的变量)
fast=head;//前链表的指针(需要快速移动)
low=head2;//后链表的指针
while(low!=null){
c=low.next;//存储逆链表的指针的下一个更新节点
temp=fast.next;//存储前链表指针的下一个更新节点
low.next=fast.next;
fast.next=low;
low=c;
fast=temp;
}
return;
}
}