【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 ...
随机推荐
- 注塑成型工艺知识大全(Injection Molding)
注塑成型,广泛用于热塑性塑料产品的制造工艺 工艺成本:模具费用(高),单件费用(低) 典型产品:汽车塑料部件,消费电子产品塑料外壳等 产量适合:只适合大批量生产 质量:极高的表面精确度,同一批次的产品 ...
- IE8 浏览器自动保存文档副本,添加缓存
若响应(response)HTTP头信息中没有关于缓存的头信息,则在IE8中第二次请求网页时,从缓存中拿取文件,而不是重新向服务器请求.而在Firefox或chrome则是重新向服务器请求. 解决方法 ...
- Java:网络编程之IP、URL
java.net 类 InetAddress 此类表示互联网协议 (IP) 地址. 会抛出异常 UnknownHostException 直接已知子类: Inet4Address ...
- Model的验证
ModelValidator与ModelValidatorProvider ModelValidator public abstract class ModelValidator { public v ...
- 【分享】Maven插件的源码下载(SVN)
偶然的情况下找到了Maven插件源码的网址,现分享下 http://svn.apache.org/repos/asf/maven/plugins/ 可以使用SVN下载,在添加新的资源路径时,把上面的网 ...
- 设备模型之kobject,kset及其关系
Linux2.6以后的设备驱动,都是在设备模型的基础上构建的,因此,要编写linux下的设备驱动程序,不论是usb设备,pci设备等,都需要了解设备模型. 设备模型的基础结构体主要是kobject,k ...
- Linux Java 环境变量设置
对整个机器:所有用户 1,在/etc/profile 文件末尾加入 export JAVA_HOME=/var/opt/jdk1.7.0_04 export PATH=$JAVA_HOME/bin:$ ...
- DataGridView中的单元格提示错误信息
http://stackoverflow.com/questions/7713988/winforms-problems-validating-a-cell-in-a-datagridview
- 1141. RSA Attack(RSA)
1141 越来越喜欢数论了 很有意思 先看个RSA的介绍 RSA算法是一种非对称密码算法,所谓非对称,就是指该算法需要一对密钥,使用其中一个加密,则需要用另一个才能解密. RSA的算法涉及三个参数,n ...
- 安装SQL2008的时候 出现System.Configuration.ConfigurationErrorsException: 创建 userSettings/Microsoft.SqlServe
System.Configuration.ConfigurationErrorsException: 创建 userSettings/Microsoft.SqlServer.Configuration ...