leetcode143- 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 this in-place without altering the nodes' values.
思路:
初看到这个题目,只是提出了空间复杂度的要求,并没有提出时间复杂度要求,因此我开始的思路比较简单。
首先固定一个位置指针,指示每次要插入的位置;
查找链表的最后一个结点;
将链表的最后一个结点插入到指示位置;
位置指针下移一步。
结束条件是:进行了链表长度的1/2次
该种思路运行结果正确,但是超时了。。。。
好坑啊,你也没要提示我时间复杂度啊
思路2:
考虑到时间复杂度的问题,又采取了另外一种思路。
首先使用快慢指针,找到链表的中心;
将链表的后半部分进行逆序;
逆序完成后,将后半部分依次插入到指定位置。
该种方法时间复杂度为O(n),空间复杂度为O(1)
代码:
public static void reorderList(ListNode head){
if(head == null || head.next == null || head.next.next == null){
return;
}else{
ListNode ptr = head, curptr = null, fast = null, slow = null;
int len = 0; //记录链表长度
while(ptr != null){
len++;
ptr = ptr.next;
}
//slow指针走到链表中心
slow = head;
fast = head;
while(fast != null && fast.next != null){
slow = slow.next;
fast = fast.next.next;
}
//查找链表中心的前一个元素
ListNode ptr1 = head, ptr2 = slow;
while(ptr1.next != slow){
ptr1 = ptr1.next;
}
//后半部分链表逆序
if(len%2 == 0){
//偶数个元素
fast = slow.next;
for(int i = 0; i < len/2-1; i++){
ptr = fast.next;
fast.next = slow;
slow = fast;
fast = ptr;
}
ptr1.next = null;
ptr2.next = null;
//偶数个元素的链表逆序完成后依次插入
curptr = head;
ListNode ptr3 = null;
for(int i=0; i<len/2; i++){
ptr = curptr.next;
curptr.next = slow;
ptr3 = slow.next;
slow.next = ptr;
curptr = ptr;
slow = ptr3;
}
}else{
//奇数个元素
slow = slow.next;
ptr1 = slow;
fast = slow.next;
for(int i= 0; i < len/2-1;i++){
ptr = fast.next;
fast.next = slow;
slow = fast;
fast = ptr;
}
ptr2.next = null;
ptr1.next = null;
//奇数个元素逆序后依次插入元素
curptr = head;
ListNode ptr3 = null;
for(int i = 0; i < len/2; i++){
ptr = curptr.next;
curptr.next = slow;
ptr3 = slow.next;
slow.next = ptr;
curptr = ptr;
slow = ptr3;
}
}
}
}
leetcode143- Reorder List问题的更多相关文章
- leetcode143. Reorder List
用快慢双指针,可以使慢指针到达中间的时候快指针到达最后一个元素(奇数),或者倒数第二个元素(偶数).慢指针后面的元素是后半个链表,把后半个链表进行reverse,然后再插在原来的链表中就可以了 /** ...
- Leetcode143. Reorder List重排链表
给定一个单链表 L:L0→L1→-→Ln-1→Ln , 将其重新排列后变为: L0→Ln→L1→Ln-1→L2→Ln-2→- 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换. 示例 1: ...
- [Swift]LeetCode143. 重排链表 | 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 may not mod ...
- LeetCode143: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 d ...
- [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 ...
- 13. Reorder List
Reorder List Given a singly linked list L: L0→L1→…→Ln-1→Ln, reorder it to: L0→Ln→L1→Ln-1→L2→Ln-2→… Y ...
- String reorder
本问题出自:微软2014实习生及秋令营技术类职位在线测试 (Microsoft Online Test for Core Technical Positions) Description For th ...
- 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 ...
- 62. 链表重排[Reorder List]
[本文链接] http://www.cnblogs.com/hellogiser/p/reorder-list.html [题目] Given a singly linked list L: L0→L ...
随机推荐
- nor flash和nand flash的区别
NOR和NAND是现在市场上两种主要的非易失闪存技术.Intel于1988年首先开发出NOR flash技术,彻底改变了原先由EPROM和EEPROM一统天下的局面.紧接着,1989年,东芝公司发表了 ...
- Ruby--CSV
1. 解析CSV: (1)读取文件:csv = CSV.read("#{Rails.root}/public/data/statecountycity.csv", :headers ...
- php-fpm
install php-fpm # Ubuntu sudo apt-get install python-software-properties; sudo add-apt-repository pp ...
- 开班典礼-老师玩命的教,大家玩命的学,沉静,18K
接下来的四个月决定我的命运,三年前决定现在,现在决定三年后.喜讯,双元安卓四期,1368$,到第二期仍然不成熟,打分意见多写, 孙健:15011386618 喊出你 的目标.自己监督不了自己,别人可能 ...
- [转]百度MP3音乐API接口及应用
当你在百度去搜索一首歌时,你会发现有种更简单的方法,嘿嘿,告诉你个秘密,百度有个不公开的API http://box.zhangmen.baidu.com/x?op=12&count=1&am ...
- java时间格式串
yyyy-mm-dd 和yyyy-MM-dd转换出来的日期不用. 用"yyyy-MM-dd"
- mysql 密码篇
通过MySQL命令行,可以修改MySQL数据库的密码,下面就为您详细介绍该MySQL命令行,如果您感兴趣的话,不妨一看. 格式:mysqladmin -u用户名 -p旧密码 password 新密码 ...
- 【转】CSS(10)盒子模型
CSS中, Box Model叫盒子模型(或框模型),Box Model规定了元素框处理元素内容(element content).内边距(padding).边框(border) 和 外边距(marg ...
- Nginx 禁用IP IP段
最近公司网站被竞争对手用爬虫频繁访问,所以我们这边要禁止这些爬虫访问,我们通过nginx 指令就可以实现了 方法一:直接在LB机器上封IP 1.在 blocksip.conf 文件中加入要屏蔽的ip或 ...
- SVM神经网络的术语理解
SVM(Support Vector Machine)翻译成中文是支持向量机, 这里的“机(machine,机器)”实际上是一个算法.而支持向量则是指那些在间隔区边缘的训练样本点[1]. 当初看到这个 ...