leetcode oj java 143. Reorder List

来源:互联网 发布:编程电极怎么编 编辑:程序博客网 时间:2024/05/20 23:06

一、问题描述:

Given a singly linked list LL0L1→…→Ln-1Ln,
reorder it to: L0LnL1Ln-1L2Ln-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}

二、解决思路:

例如链表为 1 2 3 4 5 6 7 8 9 10 那么我们想得到的是 1 10 2 9 3 8 4 7 6 5 分解如下:

可以看到得到的list可以看做两个list交叉插入得到的。 list1是原来list 的前 (n+1)/2 个, list2是原来的List的 后半部分。

我们首先用快慢指针的方法(快指针每次都两格,慢指针每次走一格)找到中间节点。将list分为两部分list1和list2,并把list2翻转。随后将list2间隔的插入

到list1中即可。

三、代码:

package T01;/** * @author 作者 : xcy * @version 创建时间:2017年1月15日 下午2:13:08 *          类说明 */public class t143 {    public static void main(String[] args) {        // TODO Auto-generated method stub        ListNode head = new ListNode(0);        ListNode l1 = new ListNode(1);        ListNode l2 = new ListNode(2);        ListNode l3 = new ListNode(3);        ListNode l4 = new ListNode(4);        ListNode l5 = new ListNode(5);        ListNode l6 = new ListNode(6);        ListNode l7 = new ListNode(7);        ListNode l8 = new ListNode(8);        ListNode l9 = new ListNode(9);        ListNode l10 = new ListNode(10);        head.next = l1;        l1.next = l2;        l2.next = l3;        l3.next = l4;        l4.next = l5;        l5.next = l6;        l6.next = l7;        l7.next = l8;        l8.next = l9;        l9.next = l10;        reorderList(head);        while (head != null) {            System.out.println(head.val);            head = head.next;        }    }    public static void reorderList(ListNode head) {        // split;        if (head == null || head.next == null) {            return;        }        ListNode p1 = head;        ListNode p2 = head;        while (p2 != null && p2.next != null) {            p2 = p2.next;            if (p2 != null && p2.next != null) {                p2 = p2.next;            } else {                break;            }            p1 = p1.next;        }        ListNode tmp1 = head;        ListNode tmp2 = p1.next;        p1.next = null;        //reverse tmp2        ListNode tmp2_new = null;        while (tmp2 != null) {            ListNode ex = tmp2;            tmp2 = tmp2.next;            ex.next = tmp2_new;            tmp2_new = ex;        }        // merge         p1 = tmp1;        p2 = tmp2_new;        while (p1 != null && p2 != null) {            ListNode t1 = p1.next;            ListNode t2 = p2.next;            p1.next = p2;            p2.next = t1;            p1 = t1;            p2 = t2;        }        head = tmp1;    }}

0 0