---
# System prepended metadata

title: 1019. Next Greater Node In Linked List
tags: [Leetcode, LinkedList, Medium, MonotonicStack]

---

# 1019. Next Greater Node In Linked List

###### tags: `Leetcode` `Medium` `MonotonicStack` `LinkedList`

---
要找的是往右看離自己最近比自己大的，所以可以用嚴格遞增的單調棧。當獲得了鏈表下一個值，並將其與堆棧中所有元素（從最上面的元素開始）進行比較。如果在堆棧中找到一個小於當前值的元素，則將其從棧中彈出，並將其值設置為當前值。

單調棧迫使您尋找下一個最大值。如果找到了下一個最大值，則將棧中比它小的彈出，因此堆棧中剩餘的值將大於找到的任何其他值。同樣，堆棧中的值必須按降序排列，因為如果再次發現較大的值，它們將已經從堆棧中彈出。

因此，算法如下：

創建一個將返回的答案數組，但默認值為0
創建一個棧
開始遍歷鏈錶的每個節點。
對於每個值，將此值與堆棧頂部進行比較。如果它大於堆棧上的值，則將比它小的彈出，大魚吃小魚的概念，並獲取該值的索引，然後直接使用當前值在答案數組中對其進行更新。對棧中小於curr.val的每個值重複
將其值和index放入棧，然後移至下一個值。
當您到達節點的末尾時，不論如何往右也找不到比較大的值。由於這些索引的答案數組已經設置為0，因此可以立即返回。

https://leetcode.com/problems/next-greater-node-in-linked-list/discuss/313587/Python-97-solution-with-detailed-explanation


Time $O(n)$ (amortized)
Space $O(n)$

```python
# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution:
    def nextLargerNodes(self, head: ListNode) -> List[int]:
        # initializing the position 
        index = 0
        stack = []
        
        # List[int] to be returned
        ans = [] 
        
        #traverse the linked list till you reach the end of it 
        while head:
            #appending a zero when we start with the head
            ans.append(0)
            # If the stack has some value and the top of stack has value less than the current linked list node value, 
            # pop the stack and insert the value of current node at that index, 
            # do that till the stack is empty. This means for all the values on the left, current value is the next greater
            while stack and stack[-1][1] < head.val:
                idx, _ = stack.pop()
                ans[idx] = head.val
                
            #push the (index, head.val on the stack to compare with on the next iteration)
            stack.append((index, head.val))
            # increment the index
            index += 1
            head = head.next
        return ans
        
```