Given a singly linked list L: L0 → L1 → … → Ln-1 → Ln
reorder it to: L0 → Ln → L1 → Ln-1 → L2 → Ln-2 → …
分析:先是用快慢指针找到中间点。然后从中间点开始生成一个后半段的倒序的list。然后插空合并
L: L0 → L1 → … → Lk
L: Ln → Ln-1 → … → Lk+1
/**
* 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) {
if(head == null || head.next == null) return;
ListNode first = head, second = head.next;
while(second != null && second.next != null) {
first = first.next;
second = second.next.next;
}
ListNode newHead = first.next;
first.next = null;
first = newHead.next;
newHead.next = null;
while(first != null) {
ListNode tmp = first.next;
first.next = newHead;;
newHead = first;
first = tmp;
}
first = head;
second = newHead;
while(second != null) {
ListNode tmp1 = first.next;
ListNode tmp2 = second.next;
first.next = second;
second.next = tmp1;
first = tmp1;
second = tmp2;
}
}
}