【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 ...
随机推荐
- linux下tomcat下部署项目如何打包压缩备份
范例一:将整个 /etc 目录下的文件全部打包成为 /tmp/etc.tar[root@linux ~]# tar -cvf /tmp/etc.tar /etc <==仅打包,不压缩![root ...
- 百度首页html代码
把百度设为主页 关于百度 About Baidu ©2015 Baidu 使用百度前必读 意见反馈 京ICP证030173号
- Qt通过UDP传图片,实现自定义分包和组包
一.包头结构体 //包头 struct PackageHeader { //包头大小(sizeof(PackageHeader)) unsigned int uTransPackageHdrSize; ...
- AlarmManager.RTC和ELAPSED_REALTIME的区别
AlarmManager.RTC,硬件闹钟,不唤醒手机(也可能是其它设备)休眠:当手机休眠时不发射闹钟. AlarmManager.RTC_WAKEUP,硬件闹钟,当闹钟发躰时唤醒手机休眠: Alar ...
- Mac显示和隐藏文件的命令
打开命令行输入即可,不过要重启Finder才能看到效果 显示: defaults write com.apple.finder AppleShowAllFiles -bool true 隐藏: def ...
- 人脸识别算法准确率最终超过了人类 The Face Recognition Algorithm That Finally Outperforms Humans
Everybody has had the experience of not recognising someone they know—changes in pose, illumination ...
- ZOJ 3367 Counterfeit Money(最大相同子矩阵)
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=3909 题意:给出两个矩阵A和B,找出最大的相同子矩阵S.输出S的高和 ...
- Makefile简介
1.源程序的编译在Linux下面,如果要编译一个C语言源程序,我们要使用GNU的gcc编译器. 下面我们以一个实例来说明如何使用gcc编译器.假设我们有下面一个非常简单的源程序(hello.c):in ...
- leetcode:Remove Linked List Elements
Remove all elements from a linked list of integers that have value val. ExampleGiven: 1 --> 2 --& ...
- Python3 学习第六弹: 迭代器与生成器
1> 迭代器 迭代的意思类似递归一般,不断地对一个对象做重复的操作.来看个例子: class Fibs: def __init__(self): self.last = self.now = 1 ...