Leetcode NO.143 Reorder List
2015-07-14 05:18
344 查看
本题题目要求如下:
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
之前做这道题感觉还是挺难的,但是最近做了几道reverse linked list相关的题,就不难了。。
本题的思路相当直接,难点在于写出无bug的链表翻转操作。。
步骤:
得到linkedlist的node数量
通过linkedlist的node数量得到中点,以及中点前面的一点,中点前面的点指向nullptr,这样则成功把linkedlist分割成两个链表
将后面的链表翻转,具体操作可以参考我的这两篇博客: NO.206 和 NO.234
然后,将两个链表进行merge操作即可
详细代码如下:
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}.
之前做这道题感觉还是挺难的,但是最近做了几道reverse linked list相关的题,就不难了。。
本题的思路相当直接,难点在于写出无bug的链表翻转操作。。
步骤:
得到linkedlist的node数量
通过linkedlist的node数量得到中点,以及中点前面的一点,中点前面的点指向nullptr,这样则成功把linkedlist分割成两个链表
将后面的链表翻转,具体操作可以参考我的这两篇博客: NO.206 和 NO.234
然后,将两个链表进行merge操作即可
详细代码如下:
/** * 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 == nullptr or head->next == nullptr) { return; } // 1, count the number of nodes ListNode* tmp = head; int cnt = 0; while (tmp != nullptr) { ++cnt; tmp = tmp->next; } // 2, split the linkedlist ListNode* pre; tmp = head; for (int i = 0; i < (cnt + 1) / 2; ++i) { pre = tmp; tmp = tmp->next; } pre->next = nullptr; // 3, reverse the second half ListNode* new_node = new ListNode(0); ListNode* after = tmp->next; new_node->next = after; tmp->next = nullptr; while (after != nullptr) { after = after->next; new_node->next->next = tmp; tmp = new_node->next; new_node->next = after; } // 4, merge two linked list pre = head; ListNode* pre_next; ListNode* tmp_next; while (tmp != nullptr) { pre_next = pre->next; tmp_next = tmp->next; pre->next = tmp; tmp->next = pre_next; pre = pre_next; tmp = tmp_next; } } };
相关文章推荐
- Git skills in reseting files
- HackerRank - "Mr K marsh"
- leetcode 234: Palindrome Linked List
- [Leetcode]Reorder List
- LAMP环境CentOS6.4 PHP5.4随笔未整理
- visual studio NuGet
- C/C++程序占用内存分析
- #leetcode#Binary Tree Zigzag Level Order Traversal
- 2015年6月23日-7月12日,进行54小时,剩3651小时
- ISO/IEC 9899:2011 条款6.2.5——类型
- 语音识别(SR)的秘密
- c++实现AVLTree--非递归插入
- C++实现数组最大堆排序
- C语言之基本算法40—字符串删除元音字母倒序输出
- log4j教程 12、日志记录到数据库
- log4j教程 11、日志记录到文件
- Tomcat(1)正确打开方式
- log4j教程 10、PatternLayout
- log4j教程 9、HTMLLayout
- log4j教程 8、日志格式化