LeetCode No.143 Reorder List
来源:互联网 发布:二战意大利知乎 编辑:程序博客网 时间:2024/05/16 14:03
题目:给定一个单向链表L: L0,L1,…Ln-1,Ln;
将其重新排序为:L0,Ln,L1,Ln-1,L2,Ln-2…
必须就地重排并且不能交换节点中的值;
例子:1->2->3->4,返回:1->4->2->3
思路:仔细观察我们可以发现,这道题的返回结果中,链表前半部分节点的相对顺序没有发生变化,而后半部分节点的相对顺序发生了逆转;那么我们就可以先将链表的后半部分反转,然后再重排整个链表即可,如下图所示:
1. 原始链表:
2. 反转链表的后半部分:
3. 重排整个链表:
代码如下:
注:链表长度为奇数和为偶数时该算法都可以正确运行!
/** * 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 *fast = head, *mid = head; while(fast && fast->next) { fast = fast->next->next; mid = mid->next; } //反转后半部分的链表 mid = reverse(mid); ListNode *curr = head; ListNode *nc = nullptr, *nm = nullptr; //重排链表 while((nc = curr->next) && (nm = mid->next)) { curr->next = mid; mid->next = nc; curr = nc; mid = nm; } } private: ListNode* reverse(ListNode *start) { ListNode *prev = nullptr; ListNode *curr = start; while(curr) { ListNode *n = curr->next; curr->next = prev; prev = curr; curr = n; } return prev; }};
运行结果:
阅读全文
0 0
- Leetcode NO.143 Reorder List
- leetCode No.143 Reorder List
- LeetCode No.143 Reorder List
- LeetCode(143)Reorder List
- LeetCode 143 Reorder List
- LeetCode: Reorder List [143]
- [leetcode 143] Reorder List
- [LeetCode 143]Reorder List
- leetcode || 143、Reorder List
- [leetcode] #143 Reorder List
- Reorder List - LeetCode 143
- Leetcode[143]-Reorder List
- leetcode[143]:Reorder List
- LeetCode 143: Reorder List
- LeetCode(143) Reorder List
- [Leetcode]#143 Reorder List
- 143 Reorder List [Leetcode]
- (Leetcode 143 )Reorder List
- Java 数组排序(冒泡和选择排序) 学习笔记
- 在linux上安装 elasticsearch-php
- 简单计时器的实现方法(类似秒表)
- composer的安装及更新
- hdu--6154--CaoHaha's staff(2017中国大学生程序设计竞赛
- LeetCode No.143 Reorder List
- java的一些不常使用但自己觉得重要的类
- Java面试题4:异常
- CSDN 再见
- 图片Gaussian pyramid(一)
- 解决向ftp服务器传图片只能传入ftpuser的根目录不能传入下级目录的问题
- NYOJ 289 苹果(01背包)两种解法,二维数组,一维数组
- java复习(2)之File类
- Elimination