题干
We are given a linked list with head
as the first node. Let's number the nodes in the list: node_1, node_2, node_3, ...
etc.
Each node may have a next larger value: for node_i
, next_larger(node_i)
is the node_j.val
such that j > i
, node_j.val > node_i.val
, and j
is the smallest possible choice. If such a j
does not exist, the next larger value is 0
.
Return an array of integers answer
, where answer[i] = next_larger(node_{i+1})
.
Note that in the example inputs (not outputs) below, arrays such as [2,1,5]
represent the serialization of a linked list with a head node value of 2, second node value of 1, and third node value of 5.
Example 1:
Input: [2,1,5]
Output: [5,5,0]
Example 2:
Input: [2,7,4,3,5]
Output: [7,0,5,5,0]
Example 3:
Input: [1,7,5,1,9,2,5,1]
Output: [7,9,9,9,0,5,0,0]
Note:
1 <= node.val <= 10^9
for each node in the linked list.- The given list has length in the range
[0, 10000]
.
思路
第一想法是将i的value和后续ret[i...n]的比较,如果有比它大的就作为ret[i]的值,但是这么写的算法time limit exceed
转换思路
如果能够从后往前遍历,解法很简单,用一个栈来保存遇到的最大的数字。
如果当前数字大于等于栈顶,那栈pop,直到栈空(ret[i] = 0),或找到比当前数字大的数字(ret[i] = stack.top())
如果当前数字小于栈顶,ret[i] = stack.top()
无论如何,将当前数字入栈
为了算法复杂度低,从前往后遍历,记录二元组(位置,当前值)。如果遍历到一个元素,栈顶如果比当前值小,则栈顶位置后续第一个比它大的元素就是当前值,栈顶出栈,循环直到栈顶比当前值大。
保证栈是一个栈底到栈顶递减的数组,每次都比较栈顶的值
# 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]
"""
ret = []
stack = []
i = 0
while head:
ret.append(0)
while len(stack) and stack[-1][1] < head.val:
record = stack.pop()
ret[record[0]] = head.val
stack.append((i, head.val))
i = i + 1
head = head.next
return ret