【LeetCode】143. Reorder List 解題報告
143. Reorder List / Medium
You are given the head of a singly linked-list. The list can be represented as:
L0 → L1 → … → Ln - 1 → Ln
Reorder the list to be on the following form:
L0 → Ln → L1 → Ln - 1 → L2 → Ln - 2 → …
You may not modify the values in the list’s nodes. Only nodes themselves may be changed.
Example 1:
Input: head = [1,2,3,4]
Output: [1,4,2,3]
Example 2:
Input: head = [1,2,3,4,5]
Output: [1,5,2,4,3]
Constraints:
- The number of nodes in the list is in the range [1, 5 * 10^4].
- 1 <= Node.val <= 1000
思路
這一題乍看複雜,其實不然。實際上可以被分成三個步驟:找中點、翻轉、合併。
由於題目要求要在原來的 List 上進行操作,我們不能存到另一個新的 List。
首先找到整個 List 的中點,將 List 從中點斷開,形成兩個獨立的 List。
接著翻轉(Reverse)後半部的 List,最後再將後半部 List 的節點間隔地插入到前半部 List。
前兩個步驟可以參考另外兩題:
- Middle of the Linked List
- Reverse Linked List
尋找中點
使用快慢指標,快的指標走兩步,慢的走一步,當快指標到 List 的尾巴時,慢的會剛好在中間。
翻轉 / 合併 List
好像沒什麼特別的,畫個圖就能理解了。很簡單的指標操作。
效能
Complexity
- Time Complexity: O(N)
- Space Complexity: O(1)
LeetCode Result
- Runtime: 32 ms
- Memory Usage: 17.8 MB
- https://leetcode.com/submissions/detail/505846393/
Code
1 | class Solution { |