トピック
リンクされたリストの先頭ノードの先頭を指定します。
右側の値が大きいノードをすべて削除します。
変更されたリンク リストのヘッド ノード 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の範囲内です。
アイデア
単調スタックを使用し、左から右に単調減少する配列を保持し、ノードに値を割り当てます。
単調スタックを構築するときは、非増加配列を保持します
。次のノードが先頭よりも大きいことがわかった場合スタックの要素の場合、スタックが空になるか、スタックの最上位要素が次のノードより大きくなるまで、スタックの最上位要素をポップし続けます。
複雑さ
時間計算量:
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