↓快轉到主要內容
  1. LeetCode/

LeetCode 61: Rotate List

·1 分鐘· ·
LeetCode Medium Linked-List Two-Pointers
Wei Yi Chung
作者
Wei Yi Chung
Working at the contributing of open source, distributed systems, and data engineering.
目錄

基本資料
#

難易度: medium 第一次嘗試:2022-10-22

  • 提交紀錄:Accepted ×2

解題思路
#

往右轉 k 格,等於把最後 k 個節點搬到前面。k 可能比長度大,先 k %= n(Linked List 模板四)。

把尾巴接回頭形成環,從頭走 n - k - 1 步就是新的尾巴,它的下一個是新的頭,在這裡斷開。

我的解法
#

class Solution:
    def rotateRight(self, head: Optional[ListNode], k: int) -> Optional[ListNode]:
        if not head:
            return None
        n, tail = 1, head
        while tail.next:
            n, tail = n + 1, tail.next
        k %= n
        if k == 0:
            return head
        tail.next = head                             # 接成環
        new_tail = head
        for _ in range(n - k - 1):
            new_tail = new_tail.next
        new_head, new_tail.next = new_tail.next, None
        return new_head

複雜度
#

時間 O(n),空間 O(1)。

要特別避免的錯誤
#

  • k 要先對長度取餘數,不然會繞很多圈。
  • 空串列和 k % n == 0 時直接回傳。

面試口說整理
#

我先算出長度和尾巴,把 k 對長度取餘數,再把尾巴接回頭形成環,從頭走 n - k - 1 步找到新的尾巴並斷開。時間 O(n)。

相關文章

LeetCode 19: Remove Nth Node From End of List
·1 分鐘
LeetCode Medium Linked-List Two-Pointers
LeetCode 19 解題筆記:從 dummy 出發,快指針先走 n + 1 步,再一起走到底,慢指針停在要刪的前一個
LeetCode 237: Delete Node in a Linked List
·1 分鐘
LeetCode Medium Linked-List
LeetCode 237 解題筆記:拿不到前一個節點,就把下一個節點的值複製過來,再刪掉下一個節點
LeetCode 24: Swap Nodes in Pairs
·1 分鐘
LeetCode Medium Linked-List Recursion
LeetCode 24 解題筆記:dummy 加上兩兩一組,prev.next、a.next、b.next 三個指標一起重接;交換的是節點不是值
LeetCode 31: Next Permutation
·1 分鐘
LeetCode Medium Array Two-Pointers
LeetCode 31 解題筆記:從右邊找第一個下降的位置 i,跟右邊比它大的最小值交換,再把 i 之後反轉;比較時要包含等於
LeetCode 11: Container With Most Water
·1 分鐘
LeetCode Medium Array Two-Pointers Greedy
LeetCode 11 解題筆記:左右指針從兩端開始,每次移動比較矮的那一邊;移動高的那邊只會讓寬度變小、高度不會變高
LeetCode 15: 3Sum
·2 分鐘
LeetCode Medium Array Two-Pointers Sorting
LeetCode 15 解題筆記:排序後固定第一個數,剩下用對撞指針找兩數和;三個位置都要跳過相同的值,才不會有重複的組合