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

LeetCode 2487: Remove Nodes From Linked List

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

基本資料
#

難易度: medium 第一次嘗試:2024-05-06

  • 提交紀錄:Accepted ×3

解題思路
#

一個節點留下來,代表右邊沒有比它大的。從左往右掃,用一個棧(Stack 的單調棧):新節點進來時,棧頂比它小的節點右邊出現了更大的值,全部彈掉。最後棧裡由下到上是非遞增的,依序接起來就是答案(Linked List 模板二提到的另一種做法是先反轉再掃)。

我的解法
#

class Solution:
    def removeNodes(self, head: Optional[ListNode]) -> Optional[ListNode]:
        stack = []
        while head:
            while stack and stack[-1].val < head.val:
                stack.pop()
            stack.append(head)
            head = head.next
        for a, b in zip(stack, stack[1:]):
            a.next = b
        stack[-1].next = None
        return stack[0]

複雜度
#

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

要特別避免的錯誤
#

  • 只彈掉嚴格比較小的,一樣大的要留下。
  • 最後一個節點的 next 要設成 None。

面試口說整理
#

留下的節點右邊沒有更大的,所以我用單調棧:新節點進來時把比它小的都彈掉,最後棧裡的節點依序串起來就是答案。時間 O(n)。

相關文章

LeetCode 143: Reorder List
·1 分鐘
LeetCode Medium Linked-List Two-Pointers Stack Recursion
LeetCode 143 解題筆記:找中點、反轉後半段、兩條交錯合併;前半段的尾巴要切斷
LeetCode 402: Remove K Digits
·1 分鐘
LeetCode Medium String Stack Greedy Monotonic-Stack
LeetCode 402 解題筆記:單調遞增 stack,遇到比頂端小的數字就把頂端刪掉(還有 k 次可刪時),最後去掉前導零
LeetCode 24: Swap Nodes in Pairs
·1 分鐘
LeetCode Medium Linked-List Recursion
LeetCode 24 解題筆記:dummy 加上兩兩一組,prev.next、a.next、b.next 三個指標一起重接;交換的是節點不是值
LeetCode 234: Palindrome Linked List
·1 分鐘
LeetCode Easy Linked-List Two-Pointers Stack Recursion
LeetCode 234 解題筆記:快慢指針找中點,反轉後半段,再從兩端往中間比;O(1) 額外空間
LeetCode 2: Add Two Numbers
·1 分鐘
LeetCode Medium Linked-List Math Recursion
LeetCode 2 解題筆記:位數是反著存的,從頭開始逐位相加帶進位;迴圈跑到兩條都走完而且沒有進位為止
LeetCode 735: Asteroid Collision
·1 分鐘
LeetCode Medium Array Stack Simulation
LeetCode 735 解題筆記:從左到右用 stack,只有「stack 頂端往右、目前的往左」才會相撞,小的爆掉,一樣大一起爆