class Solution {
public void reorderList(ListNode head) {
ListNode dummyHead = new ListNode(0, head);
ListNode slow = dummyHead;
ListNode fast = dummyHead;
/**
* 快慢指针得到中间节点
*/
while (fast != null){
fast = fast.next;
slow = slow.next;
if (fast != null){
fast = fast.next;
}
}
/**
* 将右区间反转
* 不用考虑链表长度的奇偶,只要把slow归于右区间,其肯定是最后一个
*/
ListNode leftHead = head;
ListNode rightHead = reverse(slow);
ListNode prev = dummyHead;
while (rightHead != null && leftHead != slow){
ListNode tempLeft = leftHead.next;
ListNode tempRight = rightHead.next;
prev.next = leftHead;
leftHead.next = rightHead;
prev = rightHead;
leftHead = tempLeft;
rightHead = tempRight;
}
}
public ListNode reverse(ListNode head){
if (head == null || head.next == null){
return head;
}
ListNode next = reverse(head.next);
head.next.next = head;
head.next = null;
return next;
}
}
/**
* 时间复杂度 O(n)
* 空间复杂度 O(n)
*/
https://leetcode-cn.com/problems/reorder-list/