Reorder List
- leetcode: Reorder List | LeetCode OJ
- lintcode:
You must do this in-place without altering the nodes’ values.
For example,
Given , reorder it to {1,4,2,3}
.
" class="reference-link">题解1 - 链表长度(TLE)
既然依赖链表长度信息,那么要做的第一件事就是遍历当前链表获得其长度喽。获得长度后即对链表进行遍历,小心处理链表节点的断开及链接。用这种方法会提示 TLE,也就是说还存在较大的优化空间!
C++ - TLE
- 异常处理,对于节点数目在两个以内的无需处理。
- 遍历链表,第一个索引处的节点使用
last
表示,第二个索引处的节点的前一个节点使用表示。 - 处理链表的链接与断开,迭代处理下一个
last
。
复杂度分析
- 遍历整个链表获得其长度,时间复杂度为 $$O(n)$$.
- 双重
for
循环的时间复杂度为 $$(n-2) + (n-4) + … + 2 = O(\frac{1}{2} \cdot n^2)$$. - 总的时间复杂度可近似认为是 $$O(n^2)$$, 空间复杂度为常数。
C++
源码分析
相对于题解1,题解2更多地利用了链表的常用操作如反转、找中点、合并。
- 找中点:我在九章算法模板的基础上增加了对
head->next
的异常检测,增强了鲁棒性。 - 反转:非常精炼的模板,记牢!
复杂度分析
找中点一次,时间复杂度近似为 O(n). 反转链表一次,时间复杂度近似为 O(n/2). 合并左右链表一次,时间复杂度近似为 O(n/2). 故总的时间复杂度为 O(n).