Given a singly linked list L: L0→L1→…→Ln-1→Ln,
reorder it to: L0→Ln→L1→Ln-1→L2→Ln-2→…
You must do this in-place without altering the nodes' values.
For example,
Given {1,2,3,4}
, reorder it to {1,4,2,3}
.
1.找到中点
2.reverse后半段 注意 reverse(slow.next) 并且 slow.next = null;
3.merge
/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */ public class Solution { public void reorderList(ListNode head) { if(head == null || head.next == null || head.next.next == null) return; ListNode slow = head; ListNode fast = head; while(fast != null && fast.next != null){ slow = slow.next; fast = fast.next.next; } fast = reserve(slow.next); slow.next=null; slow = head; while(fast != null){ ListNode temp = slow.next; ListNode temp2 = fast.next; slow.next = fast; slow = temp; fast.next = temp; fast = temp2; } } public ListNode reserve(ListNode head){ if(head == null || head.next == null) return head; ListNode dummy = new ListNode(0); dummy.next = head; ListNode pre = dummy; ListNode first = head; ListNode cur = head.next; while(cur != null){ first.next = cur.next; cur.next = pre.next; pre.next = cur; cur= first.next; } return pre.next; } }