[leetcode] 143. Reorder List 解题报告
2016-01-08 08:18
363 查看
题目链接:https://leetcode.com/problems/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.
For example,
Given
思路:先使用快慢指针将链表从中间分割成两段,然后后半段就地逆置.之后合并插入到前半段链表即可,时间复杂度O(n)。
代码如下:
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}.
思路:先使用快慢指针将链表从中间分割成两段,然后后半段就地逆置.之后合并插入到前半段链表即可,时间复杂度O(n)。
代码如下:
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ class Solution { public: void reorderList(ListNode* head) { if(!head || !head->next) return; ListNode *slow = head, *fast = head, *p=head, *q=head; while(fast->next && fast->next->next) slow = slow->next, fast = fast->next->next; fast = slow->next, slow->next = NULL; p = fast, q = fast->next, fast->next = NULL; while(q) { auto tem = q->next; q->next = p; p = q, q = tem; } q = head; while(q && p) { auto tem1 = q->next, tem2 = p->next; p->next = q->next; q->next = p; q = tem1, p = tem2; } } };
相关文章推荐
- linux 隐藏及显示文件或目录
- 括号配对问题(南阳2)
- 聆听机器人小冰发声有感
- 4. Autolayout技术和Autoresizing技术
- 升级Win10遭遇错误代码0xc0000017的解决办法
- Machine Learning 101
- uva10341 - solve it (二分查找)
- PHP操作数据库
- Maven项目中mvn clean后找不到測试类问题
- VS2010调用VLFeat
- navicat for mysql 10.1.7注册码
- java中Math的一些用法
- HTML中<input>參数,以及文本输入框,文本域的解说
- 数据库操作增删改查
- Java时间比較
- (视频) 基于HTML5的服务器远程访问工具
- android_定义多个Activity及跳转
- poj 2038 Team Rankings 枚举排列
- UVa10886 Standard Deviation
- OSChina 周五乱弹 —— 咸蛋粥你值得拥有