주제
연결된 목록의 헤드 노드 헤드를 제공합니다.
오른쪽에 있는 값이 더 큰 모든 노드를 제거합니다.
수정된 연결리스트의 헤드 노드 헤드를 반환합니다.
예시 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