码迷,mamicode.com
首页 > 编程语言 > 详细

leetcode 143. Reorder List ----- java

时间:2016-11-16 11:33:54      阅读:221      评论:0      收藏:0      [点我收藏+]

标签:额外   null   slow   code   部分   ini   example   last   fas   

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}.

 

按照题意改变链表结构。

 

1、使用list记录链表。

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
public class Solution {
    public void reorderList(ListNode head) {
        
        List<ListNode> list = new ArrayList<ListNode>();
        ListNode node = head;
        while( node != null ){
            list.add(node);
            node = node.next;
        }
        int len = list.size();
        if( len < 3)
            return ;

        node = head;
        node.next = list.get(len-1);
        node = node.next;
        for( int i = 1;i<len/2;i++){

            node.next = list.get(i);
            node.next.next = list.get(len-1-i);
            node = node.next.next;
        }
        if( len%2 != 0){
            node.next = list.get(len/2);
            node = node.next;
        }
        node.next = null;

        return ;
    }
}

 

2、使用双向队列。

 

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
public class Solution {
    public void reorderList(ListNode head) {
        
        Deque<ListNode> deque = new ArrayDeque<ListNode>();

        ListNode node = head;

        while( node != null ){
            deque.add( node );
            node = node.next;
        }
        if( deque.size() < 3)
            return ;
        node = deque.poll();
        node.next = deque.pollLast();
        node = node.next;
        while( !deque.isEmpty() ){
            node.next = deque.poll();
            node.next.next = deque.pollLast();
            node = node.next.next;
        }
        if( node != null )
            node.next = null;
        return ;
    }
}

 

 

3、不使用额外空间,找到中间点,然后将后半部分链表反转,然后将两个链表合并即可。

 

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
public class Solution {
    public void reorderList(ListNode head) {
        
        
        if( head == null || head.next == null || head.next.next == null )
            return ;
        ListNode slow = head;
        ListNode fast = head.next;
        while( fast!= null && fast.next != null){
            fast = fast.next.next;
            slow = slow.next;
        }
        
        ListNode node2 = slow;
        fast = slow.next;
        
        while( fast != null ){
            

            ListNode node = fast.next;
            fast.next = slow;
            slow = fast;
            fast = node;
            

        }
        node2.next = null;
        node2 = slow;
        ListNode node1 = head;
        
        while( node1 != null   ){
            ListNode node = node1.next;
            ListNode nn = node2.next;
            node1.next = node2;
            node2.next = node;
            node1 = node;
            node2 = nn;
        }
        
        

        return ;
    }
}

 

leetcode 143. Reorder List ----- java

标签:额外   null   slow   code   部分   ini   example   last   fas   

原文地址:http://www.cnblogs.com/xiaoba1203/p/6068310.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!