Artikelverzeichnis
Thema
Geben Sie den Kopfknoten einer verknüpften Liste an.
Entfernen Sie rechts jeden Knoten mit einem größeren Wert.
Gibt den Kopfknotenkopf der geänderten verknüpften Liste zurück.
Beispiel 1:
Eingabe: head = [5,2,13,3,8]
Ausgabe: [13,8]
Erläuterung: Die Knoten, die entfernt werden müssen, sind 5, 2 und 3.
- Knoten 13 liegt rechts von Knoten 5.
- Knoten 13 liegt rechts von Knoten 2.
- Knoten 8 liegt rechts von Knoten 3.
Beispiel 2:
Eingabe: head = [1,1,1,1]
Ausgabe: [1,1,1,1]
Erläuterung: Der Wert jedes Knotens ist 1, es gibt also keine Knoten, die entfernt werden müssen.
Hinweis:
Die Anzahl der Knoten in der angegebenen Liste liegt im Bereich [1, 105]
1 <= Node.val <= 105
Ideen
Verwenden Sie einen monotonen Stapel, behalten Sie ein Array bei, das von links nach rechts monoton abnimmt, und weisen Sie den Knoten Werte zu.
Beim Erstellen eines monotonen Stapels behalten wir ein nicht zunehmendes Array bei
. Wenn wir feststellen, dass der nächste Knoten größer als der obere ist Wenn wir ein Element des Stapels sind, entfernen wir so lange das oberste Element des Stapels, bis der Stapel leer ist oder das oberste Element des Stapels größer als der nächste Knoten ist
Die Komplexität
Zeitkomplexität:
O ( n ) O(n)An ) _ _
Raumkomplexität:
Addition O ( n ) O(n)An ) _ _
Code
# 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