LeetCode -- Reorder List

原创 2015年11月21日 10:25:51
题目描述:


Given a singly linked list L: L0→L1→…→Ln-1→Ln,
reorder it to: L0→Ln→L1→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->2->3->4->5->6 ,要变成1->6->2->5->3->4,
即第i个节点指向倒数第i个节点,而倒数第i个节点,指向第i+1个节点。



解法一:
使用前后两个指针p和q。
具体实现步骤在注释中有详细说明,在此不再赘述。




由于时间复杂度为O(N^2),不够高效导致会超时。无法通过OJ的测试数据。


实现代码:

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     public int val;
 *     public ListNode next;
 *     public ListNode(int x) { val = x; }
 * }
 */
public class Solution {
    public void ReorderList(ListNode head) 
    {
        if(head == null || head.next == null || head.next.next == null){
    		return;
    	}
    	
    	var p = head;
    	var q = head;
    	while(q.next.next != null){
    		while(p.next.next != null){
    			p = p.next;
    		}
    		
    		// point head to last
    		var t = q.next;
    		q.next = p.next;
    		// point last to 2nd and set the second last to null
    		p.next.next = t;
    		
    		// point 2nd last to null
    		p.next = null;
    
    		// reset p and q
    		p = t;
    		q = t;
    		if(q.next == null){
    			break;
    		}
    	}
    }
}





解法二:


本实现参考了连接:
http://www.acmerblog.com/reorder-list-leetcode-6088.html




1.使用slow和fast指针将链表分为两部分,part1和part2 ,假设链表为1->2->3->4->5->6->7->8, part1 = {1->2->3->4} , part2= {5->6->7->8}
2.然后对part2逆置,即8->7->6->5
3.然后分别将part1[0]->part2[0], part2[0]->part1[1], part1[1]->part2[1]...
即,对于i < len - 1
part1[i] -> part2[i]
part2[i] -> part1[i+1]
i++


实现代码:




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


版权声明:本文为博主原创文章,未经博主允许不得转载。

LeetCode Reorder List 新鲜出炉问题的解答

终于调试出来了,考的是链表的操作,要对链表的操作非常清楚,否则也是很难调试的,总会有问题出来。我完成的时候50个accepted左右,提交的有400多。差不多10%多一点的通过率,看来还是有一定难度的...
  • kenden23
  • kenden23
  • 2013年11月03日 22:27
  • 2372

LeetCode OJ 之 Reorder List (重新排序链表)

题目: Given a singly linked list L: L0→L1→…→Ln-1→Ln, reorder it to: L0→Ln→L1→Ln-1→L2→Ln-2→… 给...
  • u012243115
  • u012243115
  • 2014年11月17日 11:35
  • 418

Reorder List 链表首尾交叉排列@LeetCode

思路就是: 1 用快慢指针找到中间节点 2 翻转中间节点后一个元素到最后一个元素区间的所有元素 3 断开前半段和翻转后的后半段元素 4 把前半段和翻转后的后半段元素以交叉的方式合并起来 5 特殊处理输...
  • hellobinfeng
  • hellobinfeng
  • 2013年12月17日 05:30
  • 2019

leetcode -- Reorder List -- 重点,很适合作为面试题

https://leetcode.com/problems/reorder-list/ 参考http://bookshadow.com/weblog/2015/01/29/leetcode-reor...
  • xyqzki
  • xyqzki
  • 2015年12月09日 20:23
  • 250

【leetcode】【单链表】【143】Reorder List

#include using namespace std; struct ListNode { int val; ListNode *next; ListNode(int x) : val(x...
  • ruan875417
  • ruan875417
  • 2015年05月24日 19:54
  • 212

Reorder List 重排字符串

题目: 链接 解法1: 先求出字符串changd
  • skyoceanlover
  • skyoceanlover
  • 2014年08月11日 18:35
  • 215

重新排列链表Reorder List

在leetcode中题目是这样描述的: Given a singly linked list L: L0→L1→…→Ln-1→Ln, reorder it to: L0→Ln→L1→Ln-1→...
  • laiyinping
  • laiyinping
  • 2014年07月15日 11:26
  • 258

LeetCode总结 -- 树的构造篇

这篇总结主要介绍树中比较常见的一类题型--树的构造。其实本质还是用递归的手法来实现,但是这类题目有一个特点,就是它是构建一棵树,而不是给定一棵树,然后进行遍历,所以实现起来思路上有点逆向,还是要练习一...
  • linhuanmars
  • linhuanmars
  • 2014年11月12日 10:40
  • 13855

LeetCode之Tree题目汇总

Balanced Binary TreeGiven a binary tree, determine if it is height-balanced.For this problem, a heig...
  • Yano_nankai
  • Yano_nankai
  • 2015年12月29日 20:43
  • 697

LeetCode之Graph题目汇总

Course ScheduleThere are a total of n courses you have to take, labeled from 0 to n - 1.Some courses...
  • Yano_nankai
  • Yano_nankai
  • 2015年12月30日 10:25
  • 445
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:LeetCode -- Reorder List
举报原因:
原因补充:

(最多只允许输入30个字)