reorder-list

来源:互联网 发布:明星和普通人长相知乎 编辑:程序博客网 时间:2024/05/25 23:29

中等 重排链表

24%
通过

给定一个单链表L: L0→L1→…→Ln-1→Ln,

重新排列后为:L0→Ln→L1→Ln-1→L2→Ln-2→…

必须在不改变节点值的情况下进行原地操作

您在真实的面试中是否遇到过这个题? 
Yes
样例

给出链表1->2->3->4->null,重新排列后为1->4->2->3->null




/** * 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     */    private ListNode reverse(ListNode head) {        ListNode newHead = null;        while (head != null) {            ListNode temp = head.next;            head.next = newHead;            newHead = head;            head = temp;        }        return newHead;    }    private void merge(ListNode head1, ListNode head2) {        int index = 0;        ListNode dummy = new ListNode(0);        while (head1 != null && head2 != null) {            if (index % 2 == 0) {                dummy.next = head1;                head1 = head1.next;            } else {                dummy.next = head2;                head2 = head2.next;            }            dummy = dummy.next;            index ++;        }        //走到这,循环结束,要么是head1 == null,要么是head2 == null        //两个链表要是不一样长,会漏一个         if (head1 != null) {            /**             *head2 == null,而head1还有值             */             dummy.next = head1;        }        else {            /*            head1 == null 而head2还有值            */            dummy.next = head2;        }    }    private ListNode findMiddle(ListNode head) {        ListNode slow = head, fast = head.next;        while (fast != null && fast.next != null) {            fast = fast.next.next;            slow = slow.next;        }        return slow;    }    public void reorderList(ListNode head) {        if (head == null || head.next == null) {            return;        }        ListNode mid = findMiddle(head);        ListNode tail = reverse(mid.next);        mid.next = null;        merge(head, tail);    }}


0 0
原创粉丝点击