Version I
/**
* Definition for ListNode.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int val) {
* this.val = val;
* this.next = null;
* }
* }
*/
public class Solution {
/**
* @param head: The head of linked list.
* @return: void
*/
public void reorderList(ListNode head) {
// 2015-08-22 基于栈 O(n)
if (head == null || head.next == null) {
return;
}
ListNode midNode = findMid(head);
ListNode leftHead = head;
ListNode rightHead = midNode.next;
midNode.next = null;
ArrayDeque<ListNode> stack = new ArrayDeque<>();
// 入栈
while (rightHead != null) {
stack.push(rightHead);
rightHead = rightHead.next;
}
// 出栈
while (!stack.isEmpty()) {
ListNode temp = leftHead.next;
leftHead.next = stack.pop();
leftHead = leftHead.next;
leftHead.next = temp;
if (leftHead.next != null) {
leftHead = leftHead.next;
}
}
return;
}
/**
* return the middle node of the list
*/
private ListNode findMid(ListNode head) {
if (head == null || head.next == null) {
return head;
}
ListNode fast = head;
ListNode slow = head;
while (fast.next != null && fast.next.next != null) {
fast = fast.next.next;
slow = slow.next;
}
return slow;
}
}
Version II
/**
* Definition for ListNode.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int val) {
* this.val = val;
* this.next = null;
* }
* }
*/
public class Solution {
/**
* @param head: The head of linked list.
* @return: void
*/
public void reorderList(ListNode head) {
// 2015-04-24 O(n)
if (head == null) {
return;
}
ListNode mid = findMid(head);
ListNode tail = reverseList(mid.next);
mid.next = null;
mergeList(head, tail);
}
private ListNode findMid (ListNode head) {
if (head == null) {
return head;
}
ListNode slow = head;
ListNode fast = head;
while (fast.next != null && fast.next.next != null) {
fast = fast.next.next;
slow = slow.next;
}
return slow;
}
private ListNode reverseList(ListNode head) {
if (head == null) {
return head;
}
ListNode dummy = new ListNode(0);
while (head != null) {
ListNode temp = head.next;
head.next = dummy.next;
dummy.next = head;
head = temp;
}
return dummy.next;
}
private ListNode mergeList(ListNode listA, ListNode listB) {
// 已知 listB 比 listA 短一 或 相等
ListNode dummy = new ListNode(0);
ListNode tail = dummy;
while (listA != null && listB != null) {
tail.next = listA;
tail = tail.next;
listA = listA.next;
tail.next = listB;
tail = tail.next;
listB = listB.next;
}
if (listA != null) {
tail.next = listA;
}
return dummy.next;
}
}