Approach 1: Stack

# 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 = []
 
        curr = head
        while curr:
            stack.append(curr)
            curr = curr.next
        
        n = len(stack)
        rightMaxes = [0] * n
 
        for j in range(n - 2, -1, -1):
            val = stack.pop().val
            rightMaxes[j] = max(rightMaxes[j + 1], val)
 
        tmp = newHead = ListNode()
        curr = head
        for i in range(n):
            # Invert condition
            if rightMaxes[i] <= curr.val:
                tmp.next = curr
                tmp = tmp.next
 
            curr = curr.next
 
        tmp.next = None
        return newHead.next

Complexity

Time:
Space:

Notes

Other Languages