Given a singly linked list L: L0→L1→…→Ln-1→Ln,
reorder it to: L0→Ln→L1→Ln-1→L2→Ln-2→…
You may not modify the values in the list's nodes, only nodes itself may be changed.

Example 1:
Given 1->2->3->4, reorder it to 1->4->2->3.
Example 2:
Given 1->2->3->4->5, reorder it to 1->5->2->4->3.

1,找中点

2,后半段反转

3,前后合并

class Solution {
    private ListNode findMiddle(ListNode head) {
        ListNode slow = head;
        ListNode fast = head.next;

        while(fast != null && fast.next != null) {
            slow = slow.next;
            fast = fast.next.next;
        }
        return slow;
    }

    private ListNode reverseList(ListNode head) {
        ListNode pre = null;

        while(head != null) {
            ListNode temp = head.next;
            head.next = pre;
            pre = head;
            head = temp;
        }
        return pre;
    }

    private ListNode mergeList(ListNode head1, ListNode head2) {
        ListNode dummy = new ListNode(0);
        ListNode head = dummy;

        int index = 0;
        while(head1 != null && head2 != null) {
            if(index % 2 == 0) {
                head.next = head1;
                head1 = head1.next;
            } else {
                head.next = head2;
                head2 = head2.next;
            }
            head = head.next;
            index++;
        }
        if(head1 != null) head.next = head1;
        if(head2 != null) head.next = head2;
        return dummy.next;
    }

    public void reorderList(ListNode head) {
        if(head == null || head.next == null) return;
        ListNode mid = findMiddle(head);
        ListNode secondHalf = reverseList(mid.next);
        mid.next = null;
        mergeList(head, secondHalf);    
    }
}

results matching ""

    No results matching ""