给出一个以头节点 head
作为第一个节点的链表。链表中的节点分别编号为:node_1, node_2, node_3, ...
。
每个节点都可能有下一个更大值(next larger value):对于 node_i
,如果其 next_larger(node_i)
是 node_j.val
,那么就有 j > i
且 node_j.val > node_i.val
,而 j
是可能的选项中最小的那个。如果不存在这样的 j
,那么下一个更大值为 0
。
返回整数答案数组 answer
,其中 answer[i] = next_larger(node_{i+1})
。
注意:在下面的示例中,诸如 [2,1,5]
这样的输入(不是输出)是链表的序列化表示,其头节点的值为 2,第二个节点值为 1,第三个节点值为 5 。
示例 1:
输入:[2,1,5]
输出:[5,5,0]
示例 2:
输入:[2,7,4,3,5]
输出:[7,0,5,5,0]
示例 3:
输入:[1,7,5,1,9,2,5,1]
输出:[7,9,9,9,0,5,0,0]
提示:
1 <= node.val <= 10^9
[0, 10000]
范围内解题思路
与这个问题类似的问题有
Leetcode 496:下一个更大元素 I(超详细的解法!!!)
Leetcode 503:下一个更大元素 II(超详细的解法!!!)
首先遍历链表将数据存放到list
中,然后采用的单调递减栈解决(具体思路参考上面两篇和Leetcode 单调栈问题总结(超详细!!!)。
class Solution:
def nextLargerNodes(self, head: ListNode) -> List[int]:
nums = list()
while head:
nums.append(head.val)
head = head.next
stack = list()
res = [0]*len(nums)
for i, n in enumerate(nums):
while stack and nums[stack[-1]] < n:
res[stack.pop()] = n
stack.append(i)
return res
我们也可以不将链表中的元素存放到一个list
里面,而是直接去处理链表,不过对于链表我们无法快速索引具体位置的值,所以我们可以在stack
中记录(index, val)
数据对。
class Solution:
def nextLargerNodes(self, head: ListNode) -> List[int]:
res, stack = list(), list()
while head:
while stack and stack[-1][1] < head.val:
res[stack.pop()[0]] = head.val
stack.append([len(res), head.val])
res.append(0)
head = head.next
return res
reference:
https://leetcode.com/problems/next-greater-node-in-linked-list/discuss/265508/JavaC%2B%2BPython-Next-Greater-Element
我将该问题的其他语言版本添加到了我的GitHub Leetcode
如有问题,希望大家指出!!!