每日一恋 - LeetCode 143. Reorder List(重排链表)
2018-08-17 15:16
453 查看
题目描述
给定一个单链表 L:L0→L1→…→Ln-1→Ln ,
将其重新排列后变为: L0→Ln→L1→Ln-1→L2→Ln-2→…
你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
示例 1:
给定链表 1->2->3->4, 重新排列为 1->4->2->3.
示例 2:
给定链表 1->2->3->4->5, 重新排列为 1->5->2->4->3.
分析
这道题可以将后半部分的链表反转,然后依次取出节点插入到前半部分的链表中。
public void reorderList(ListNode head) { if (head == null || head.next == null) return; ListNode slow = head; ListNode fast = head; // 1. 中间位置 while (fast.next != null && fast.next.next != null) { fast = fast.next.next; slow = slow.next; } ListNode newHead = null; ListNode curHead = slow.next; // 2. 反转后半部分 while (curHead != null) { ListNode nextNode = curHead.next; curHead.next = newHead; newHead = curHead; curHead = nextNode; } slow.next = null; ListNode dummy = new ListNode(0); ListNode p = head, q = newHead, c = dummy; // 3. 拼接链表 while (p != null) { c.next = p; p = p.next; c = c.next; c.next = q; if (q != null) q = q.next; c = c.next; } }
第三步中拼接链表,shichaotan的方法非常优雅,借鉴之。
// merge two lists: O(n) for (p = head, q = newHead; p != null; ) { ListNode t = p.next; p = p.next = q; q = t; }
如果文章里有说得不对的地方请前辈多多指正~ 与君共勉~
阅读更多相关文章推荐
- [LeetCode] 重排链表 reorder linked list
- LeetCode 143. Reorder List(重组链表)
- [Leetcode] Reorder list 重排链表
- Leetcode 143. Reorder List(链表重新排序)
- 【leetcode】【单链表】【143】Reorder List
- LeetCode-Reorder List-链表重排序-链表和栈的应用
- 【leetcode】【单链表】【143】Reorder List
- [LeetCode]Reorder List 链表重排序
- LeetCode之“链表”:Reorder List
- [LeetCode]--143. Reorder List(Python + Java)
- LeetCode | Reorder List(链表重新排序)
- Leetcode 143. Reorder List (Medium) (cpp)
- 62. 链表重排[Reorder List]
- 【LeeCode】Reorder List 重排链表 4000
- Reorder List 链表首尾交叉排列@LeetCode
- [LeetCode] Reorder List 链表重排序
- leetcode刷题6:对单链表重新排序--reorder list
- 链表 leetcode 143 Reorder List
- 143.leetcode Reorder List (medium)[链表调整]
- Leetcode Reorder List 链表重排序