143. 重排链表

class Solution {
    public void reorderList(ListNode head) {

        ListNode dummyHead = new ListNode(0, head);
        ListNode slow = dummyHead;
        ListNode fast = dummyHead;

        /**
         * 快慢指针得到中间节点
         */
        while (fast != null){

            fast = fast.next;
            slow = slow.next;

            if (fast != null){
                fast = fast.next;
            }
        }

        /**
         * 将右区间反转
         * 不用考虑链表长度的奇偶,只要把slow归于右区间,其肯定是最后一个
         */
        ListNode leftHead = head;
        ListNode rightHead = reverse(slow);
        ListNode prev = dummyHead;

        while (rightHead != null && leftHead != slow){

            ListNode tempLeft = leftHead.next;
            ListNode tempRight = rightHead.next;
            prev.next = leftHead;
            leftHead.next = rightHead;
            prev = rightHead;

            leftHead = tempLeft;
            rightHead = tempRight;
        }
    }

    public ListNode reverse(ListNode head){

        if (head == null || head.next == null){
            return head;
        }

        ListNode next = reverse(head.next);

        head.next.next = head;
        head.next = null;

        return next;
    }
}

/**
 * 时间复杂度 O(n)
 * 空间复杂度 O(n)
 */

https://leetcode-cn.com/problems/reorder-list/

posted @ 2021-12-19 17:43  振袖秋枫问红叶  阅读(26)  评论(0)    收藏  举报