Algorithm
LeetCode 1019. Next Greater Node In Linked List
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].
这道题是的题意是找出每个数字后边的第一个比它大的。也就是找最近的大于它的值。
刚看到这道题,就想到了单调栈的思路。以上的关系设为f(i)=j,i右边最大的数是j
如果当前的数比栈顶的数大, 那么f(s.top()) = i,这是已经确定该栈顶元素就可以出栈了。
具体实现看代码
public int[] nextLargerNodes(ListNode head) {
if (head == null) return null;
LinkedList<Pair> list = new LinkedList<>();
int[] maxRecentRight = new int[10005];
ListNode node = head;
int i;
for (i = 0; node != null; node = node.next, i++) {
Pair x;
while (list.size() > 0 && node.val > (x = list.getLast()).getNode().val) {
maxRecentRight[x.getPosition()] = node.val;
list.removeLast();
}
x = new Pair(i, node);
list.addLast(x);
}
while (list.size() > 0) {
Pair x = list.removeLast();
maxRecentRight[x.getPosition()] = 0;
}
return Arrays.copyOf(maxRecentRight, i);
}