Reorder List

2018-04-23 14:34:09

一、Odd Even Linked List

问题描述:

问题求解:

如果思考从swap角度来解决问题就会陷入一个误区,其实直接使用链表的指针分别构造出odd和even即可。

    public ListNode oddEvenList(ListNode head) {
        if (head == null || head.next == null) return head;
        ListNode odd = head, even = head.next, evenHead = even;
        while (even != null && even.next != null) {
            odd.next = odd.next.next;
            even.next = even.next.next;
            odd = odd.next;
            even = even.next;
        }
        odd.next = evenHead;
        return head;
    }

 

二、Reorder List

问题描述:

问题求解:

step1:找到中点

step2:把后半段反转,使用插入法

step3:然后开始执行一轮的插入操作

    public void reorderList(ListNode head) {
        if (head == null || head.next == null) return;
        ListNode slow = head, fast = head;
        while (fast != null && fast.next != null) {
            slow = slow.next;
            fast = fast.next.next;
        }
        ListNode cur = slow.next;
        ListNode then = null;
        while (cur != null && cur.next != null) {
            then = cur.next;
            cur.next = then.next;
            then.next = slow.next;
            slow.next = then;
        }
        cur = head;
        while (slow.next != null) {
            ListNode tmp = cur.next;
            ListNode toInsert = slow.next;
            slow.next = toInsert.next;
            toInsert.next = cur.next;
            cur.next = toInsert;
            cur = tmp;
        }
    }

 

posted @ 2018-04-23 14:41  hyserendipity  阅读(216)  评论(0编辑  收藏  举报