给出一个以头节点 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.valj
是可能的选项中最小的那个。如果不存在这样的 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]
范围内
# Definition for singly-linked list.
# class ListNode(object):
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution(object):
def nextLargerNodes(self, head):
"""
:type head: ListNode
:rtype: List[int]
"""
h = head
l = list()
while(h): #这个循环是为了把链表转数组
l.append(h.val)
h = h.next
stack = list()
res = [0 for i in range(len(l))]
cnt = 0
while(cnt < len(l)): #从前到后线性扫描
if not stack or l[stack[-1]] >= l[cnt]: #如果stack为空,或者当前栈顶对应的元素比当前扫描元素还大
stack.append(cnt)#就直接把当前下标压入栈
else:#如果当前下标对应的元素比栈顶元素大,就说明找到了比栈顶元素大的下一个数
while(stack and l[stack[-1]] < l[cnt]): #一直出栈,直到栈顶元素比当前元素小
res[stack[-1]] = l[cnt]
stack.pop()
stack.append(cnt) #把当前元素压入栈
cnt += 1
return res
举一反三,本题跟以下题是同类题:
LeetCode-Python-503. 下一个更大元素 II