leetcode2487. リンクされたリストからノードを削除します

記事ディレクトリ

トピック

リンクされたリストの先頭ノードの先頭を指定します。

右側の値が大きいノードをすべて削除します。

変更されたリンク リストのヘッド ノード head を返します。

例 1:
ここに画像の説明を挿入します

入力: head = [5,2,13,3,8]
出力: [13,8]
説明: 削除する必要があるノードは 5、2、および 3 です。

  • ノード 13 はノード 5 の右側にあります。
  • ノード 13 はノード 2 の右側にあります。
  • ノード 8 はノード 3 の右側にあります。
    例 2:

入力: head = [1,1,1,1]
出力: [1,1,1,1]
説明: 各ノードの値は 1 であるため、削除する必要があるノードはありません。

ヒント:


指定されたリスト内のノードの数は、[1, 105] 1 <= Node.val <= 105の範囲内です。

問題: 2487. リンクされたリストからノードを削除する

アイデア

単調スタックを使用し、左から右に単調減少する配列を保持し、ノードに値を割り当てます。
単調スタックを構築するときは、非増加配列を保持します
。次のノードが先頭よりも大きいことがわかった場合スタックの要素の場合、スタックが空になるか、スタックの最上位要素が次のノードより大きくなるまで、スタックの最上位要素をポップし続けます。

複雑さ

時間計算量:

O ( n ) O( n )_

空間の複雑さ:

O ( n ) O(n) _

コード

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:
    def removeNodes(self, head: Optional[ListNode]) -> Optional[ListNode]:
        stack = []
        index = head
        while index!=None:
            while stack!=[] and stack[-1]<index.val:
                stack.pop()
            stack.append(index.val)
            index = index.next

        index = head
        for i in range(len(stack)):
            index.val = stack[i]
            if i!=len(stack)-1:
                index = index.next
        if index!=None : index.next = None 
        return head

おすすめ

転載: blog.csdn.net/qq_51118755/article/details/135353497