【Leetcode】Reorder List JAVA
一、题目描述
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、暴力解法
这种解法所需的时间的时间复杂度比较高,为O(n2)

代码如下:该代码在Leetcode上提交会提示超时
public void reorderList(ListNode head) {
if(head==null||head.next==null||head.next.next==null){ //当结点的个数小于等于2时,不需要做任何操作。
return ;
}
ListNode rearNode=null; //该指针指向链表的尾结点
ListNode currentNode =head; //前面的结点进过了插入
ListNode preNode=null; //永远指向rearNode结点的前面一个结点
while(currentNode!=null){
rearNode=currentNode;
while(rearNode.next!=null){ //寻找尾结点
preNode=rearNode;
rearNode=rearNode.next;
}
if(rearNode!=currentNode){ //当rearNode与currentNode结点相等时,表示已经结束
preNode.next=null;
rearNode.next=currentNode.next;
currentNode.next=rearNode;
currentNode=rearNode.next;
}
else{
break;
}
}
}
2、时间较快的解法,该算法主要分为三个部分:
a、寻找链表的中间结点(midNode),并将链表分一分为二;一个链表的头结点分别为head和newHead;
b、将链表newHead进行反转;
c、将反转后的链表分间隔的插入都head链表中去。
d、时间复杂度为O(n)

代码实现如下:
package com.edu.leetcode;
import com.edu.leetcode.*;
public class ReorderList {
public void reorderList(ListNode head){
if(head==null||head.next==null||head.next.next==null){ //当结点的个数小于等于2时,不需要做任何操作。
return ;
}
/*
* 第一部分主要是用来寻找链表的中间结点
*/
ListNode midNode=head; //寻找链表的中间结点
ListNode rearNode=head.next; //midNode走一步,readNode走两步
while(rearNode!=null){
rearNode=rearNode.next;
if(rearNode!=null){
midNode=midNode.next;
rearNode=rearNode.next;
}
}
/*
* 第二部是将链表对半分为两个部分,并将后面那个链表进行反转
*/
ListNode newHead=midNode.next;
midNode.next=null;
ListNode curentNode=newHead; //该结点用来指向第一结点,并且永远不需要移动位置
rearNode=curentNode.next; //currentNode后面的一个结点
while(rearNode!=null){ //将currentNode后面的一个结点放到头结点(newHead)的前面
curentNode.next=rearNode.next;
rearNode.next=newHead;
newHead=rearNode;
rearNode=curentNode.next;
}
/*
* 第三部分将newHead为头结点的链表依次插入到head链表中
*/
curentNode=head; //head中当前插入的位置
rearNode=newHead; //当前的newHead结点
while(curentNode!=null&&rearNode!=null){ //将rearNode结点插入到curentNode的后面
newHead=rearNode.next; //将newHead重新赋值
rearNode.next=curentNode.next;
curentNode.next=rearNode;
curentNode=rearNode.next;
rearNode=newHead;
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
ListNode first1 = new ListNode(0);
ListNode rear1 =first1;
for(int i=1;i<10;i++){
ListNode q= new ListNode(i);
rear1.next=q;
rear1=q;
}
ListNode q=first1;
while(q!=null){
System.out.print(q.val+ ",");
q=q.next;
}
System.out.println();
ReorderList rl = new ReorderList();
rl.reorderList(first1);
ListNode p=first1;
while(p!=null){
System.out.print(p.val+ ",");
p=p.next;
}
System.out.println();
}
}
【Leetcode】Reorder List JAVA的更多相关文章
- 【LeetCode】Reorder List 解题报告
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 th ...
- 【leetcode】Reorder List (middle)
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 thi ...
- 【Leetcode】Sort List JAVA实现
Sort a linked list in O(n log n) time using constant space complexity. 1.分析 该题主要考查了链接上的合并排序算法. 2.正确代 ...
- 【leetcode】solution in java——Easy4
转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6415011.html 16:Invert Binary Tree 此题:以根为对称轴,反转二叉树. 思路:看到 ...
- 【leetcode】solution in java——Easy3
转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6412505.html 心得:看到一道题,优先往栈,队列,map,list这些工具的使用上面想.不要来去都是暴搜 ...
- 【leetcode】solution in java——Easy2
转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6410409.html 6:Reverse String Write a function that takes ...
- 【Leetcode】Reorder List
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 thi ...
- 【LeetCode】Reorder Log Files(重新排列日志文件)
这道题是LeetCode里的第937道题. 题目描述: 你有一个日志数组 logs.每条日志都是以空格分隔的字串. 对于每条日志,其第一个字为字母数字标识符.然后,要么: 标识符后面的每个字将仅由小写 ...
- 【leetcode】solution in java——Easy5
转载请注明原文地址: 21:Assign Cookies Assume you are an awesome parent and want to give your children some co ...
随机推荐
- maven也是apache下的项目
maven也是apache下的项目,你看maven官网了,域名都在Apache下
- 如何向AcmeAir注入问题代码
为什么要注入问题代码? AcmeAir的常规代码是为了压测测试准备的,所以绝大部分的操作都是可以在几十毫秒中就可以正常返回的.为了向用户展示我们APM工具可以在源代码级别发现系统潜在问题,我们需要在A ...
- SPRING IN ACTION 第4版笔记-第九章Securing web applications-011-把敏感信息请求转为https(requiresChannel())
1.把包含敏感信息的请求转为https请求,则较为安全,但如何只把有需要安全的请求转为https,而不是不加分辩就把所有请求都转为https呢?可以用requiresChannel() @Overri ...
- Android中级之网络数据解析一之xml解析
本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处! --Comic Sans MS Xml解析具有跨平台性,语言无关性,易操作性,因此广受开发者的欢迎. ...
- Spring笔记——Spring框架简介和初次框架配置
Spring简介 Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson 在其著作Expert One-On-One J2EE Deve ...
- CentOS下的账户管理
在Linux中,每个文件都分3类权限:账户本身的权限,账户所在群组的权限和其它权限.账户和群组是多对多的关系,即一个账户可以属于多个群组,一个群组可以包含多个账户.但是,对于每一个已登录的账户,只能存 ...
- kafka安装及常用命令
kafka是一个开源的分布式消息队列 他提供可靠的集群容错机制,并保证故障切换时的数据完整性. 无论从性能.可靠性.易用性都强过ActiveMQ(client的API感觉还是不如ActiveMQ好用, ...
- php post和get
作为一个计算机系统,输入输出设备作为非核心设备却是不可或缺的,硬件如此,软件亦是如此.试想一台功能强劲的计算机,如果没有输入输出设备,它与一块只能耗电并且发出嗡嗡噪音的废铁有何不同.应用程序的道理也是 ...
- JavaScript —— 对象的取值与赋值
可能是因为用惯了 Java ,对一个对象取值/赋值喜欢用 setXXX() 和 getXXX() . 在 JavaScript 中使用 setValue() 时,遇到了个奇怪的问题,所以查了下 Jav ...
- win7下制作ubuntu系统安装启动盘和U盘安装ubuntu全过程
在我搞坏了两个系统之后,一切都得从头开始了,这回好了,电脑就是一台裸机了.没办法,重新下win7吧.这个要先做一个win7的启动盘,然后再安装,只能说我技术不行,没能把win7搞定.让大神给装的win ...