一、题目描述

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、暴力解法

这种解法所需的时间的时间复杂度比较高,为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的更多相关文章

  1. 【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 ...

  2. 【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 ...

  3. 【Leetcode】Sort List JAVA实现

    Sort a linked list in O(n log n) time using constant space complexity. 1.分析 该题主要考查了链接上的合并排序算法. 2.正确代 ...

  4. 【leetcode】solution in java——Easy4

    转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6415011.html 16:Invert Binary Tree 此题:以根为对称轴,反转二叉树. 思路:看到 ...

  5. 【leetcode】solution in java——Easy3

    转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6412505.html 心得:看到一道题,优先往栈,队列,map,list这些工具的使用上面想.不要来去都是暴搜 ...

  6. 【leetcode】solution in java——Easy2

    转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6410409.html 6:Reverse String Write a function that takes ...

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

  8. 【LeetCode】Reorder Log Files(重新排列日志文件)

    这道题是LeetCode里的第937道题. 题目描述: 你有一个日志数组 logs.每条日志都是以空格分隔的字串. 对于每条日志,其第一个字为字母数字标识符.然后,要么: 标识符后面的每个字将仅由小写 ...

  9. 【leetcode】solution in java——Easy5

    转载请注明原文地址: 21:Assign Cookies Assume you are an awesome parent and want to give your children some co ...

随机推荐

  1. linux下tomcat下部署项目如何打包压缩备份

    范例一:将整个 /etc 目录下的文件全部打包成为 /tmp/etc.tar[root@linux ~]# tar -cvf /tmp/etc.tar /etc <==仅打包,不压缩![root ...

  2. 百度首页html代码

          把百度设为主页 关于百度 About Baidu ©2015 Baidu 使用百度前必读 意见反馈 京ICP证030173号

  3. Qt通过UDP传图片,实现自定义分包和组包

    一.包头结构体 //包头 struct PackageHeader { //包头大小(sizeof(PackageHeader)) unsigned int uTransPackageHdrSize; ...

  4. AlarmManager.RTC和ELAPSED_REALTIME的区别

    AlarmManager.RTC,硬件闹钟,不唤醒手机(也可能是其它设备)休眠:当手机休眠时不发射闹钟. AlarmManager.RTC_WAKEUP,硬件闹钟,当闹钟发躰时唤醒手机休眠: Alar ...

  5. Mac显示和隐藏文件的命令

    打开命令行输入即可,不过要重启Finder才能看到效果 显示: defaults write com.apple.finder AppleShowAllFiles -bool true 隐藏: def ...

  6. 人脸识别算法准确率最终超过了人类 The Face Recognition Algorithm That Finally Outperforms Humans

    Everybody has had the experience of not recognising someone they know—changes in pose, illumination ...

  7. ZOJ 3367 Counterfeit Money(最大相同子矩阵)

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=3909 题意:给出两个矩阵A和B,找出最大的相同子矩阵S.输出S的高和 ...

  8. Makefile简介

    1.源程序的编译在Linux下面,如果要编译一个C语言源程序,我们要使用GNU的gcc编译器. 下面我们以一个实例来说明如何使用gcc编译器.假设我们有下面一个非常简单的源程序(hello.c):in ...

  9. leetcode:Remove Linked List Elements

    Remove all elements from a linked list of integers that have value val. ExampleGiven: 1 --> 2 --& ...

  10. Python3 学习第六弹: 迭代器与生成器

    1> 迭代器 迭代的意思类似递归一般,不断地对一个对象做重复的操作.来看个例子: class Fibs: def __init__(self): self.last = self.now = 1 ...