LeetCode reorder-list

Posted googlemeoften

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode reorder-list相关的知识,希望对你有一定的参考价值。

Given a singly linked list LL0→L1→…→Ln-1→Ln,
reorder it to: L0→LnL1→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}.

 

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

重新排序到:L0→Ln→L1→ln1→L2→Ln 2→… 

你必须做这个就地在不改变节点的值。

例如,

考虑到{ 1,2,3,4 },重新排序到{ 1 4 2 3 }。

 

该题要先找到链表的中点,然后将中点后面的链表进行排序,排序结束以后进行 合并

package cn.edu.algorithm.huawei;

import java.util.ArrayList;

public class Solution {
    public void reorderList(ListNode head) {
        if (head == null || head.next == null || head.next.next == null)
            return;
        ListNode mid = getListMid(head);

        ListNode reverList = reverseList(mid.next);
        mid.next = null;
        merge(head, reverList);
        //print(list);
    }

    public ListNode getListMid(ListNode head) {
        ListNode slow = head;
        ListNode fast = head;
        while (fast.next != null && fast.next.next != null) {
            fast = fast.next.next;
            slow = slow.next;
        }
        return slow;
    }
    public ListNode reverseList(ListNode head) {
        ListNode pre = null;
        ListNode next = null;

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

    public void merge(ListNode node1, ListNode node2) {
        ListNode cur1 = node1;
        ListNode cur2 = node2;
        ListNode temp1;
        ListNode temp2;

        while (cur1 != null & cur2 != null) {
            temp1 = cur1.next;
            cur1.next = cur2;
            temp2 = cur2.next;
            cur2.next = temp1;
            cur1 = temp1;
            cur2 = temp2;
        }
        //return node1;
    }
    public void print(ListNode list) {
        while (list != null) {
            System.out.print(list + " ");
            list = list.next;
        }
        System.out.println("");
    }

    public static void main(String[] args) {
        ListNode node1 = new ListNode(1);
        ListNode node2 = new ListNode(2);
        ListNode node3 = new ListNode(3);
        node1.next = node2;
        node2.next = node3;

        ListNode node4 = new ListNode(4);
        ListNode node5 = new ListNode(5);
        ListNode node6 = new ListNode(6);
       // node3.next = node4;
       // node4.next = node5;

        Solution s = new Solution();
        s.reorderList(node1);

    }
}


class TreeNode {
    int val;
    TreeNode left;
    TreeNode right;

    TreeNode(int x) {
        val = x;
    }

    @Override
    public String toString() {
        return val + "";
    }
}

class ListNode {
    int val;
    ListNode next;

    ListNode(int x) {
        val = x;
        next = null;
    }

    @Override
    public String toString() {
        return val + "";
    }
}

 

以上是关于LeetCode reorder-list的主要内容,如果未能解决你的问题,请参考以下文章

leetcode-Sort List

reorder-list

reorder-list

LeetCode 0143. 重排链表

reorder-list——链表快慢指针逆转链表链表合并

143. Reorder List