https://leetcode.com/problems/next-greater-node-in-linked-list/
X. https://leetcode.com/problems/next-greater-node-in-linked-list/discuss/265508/JavaC%2B%2BPython-Next-Greater-Element
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]
X. https://leetcode.com/problems/next-greater-node-in-linked-list/discuss/265508/JavaC%2B%2BPython-Next-Greater-Element
Transform the linked list to an arraylist,
then it's a normal "next larger element" problem,
solved by stack.
then it's a normal "next larger element" problem,
solved by stack.
public int[] nextLargerNodes(ListNode head) {
ArrayList<Integer> A = new ArrayList<>();
for (ListNode node = head; node != null; node = node.next)
A.add(node.val);
int[] res = new int[A.size()];
Stack<Integer> stack = new Stack<>();
for (int i = 0; i < A.size(); ++i) {
while (!stack.isEmpty() && A.get(stack.peek()) < A.get(i))
res[stack.pop()] = A.get(i);
stack.push(i);
}
return res;
}
X. https://leetcode.com/problems/next-greater-node-in-linked-list/discuss/265687/Java-simple-one-pass-solution-O(n)-time-complexityint[] res;
public int[] nextLargerNodes(ListNode head) {
calNode(head, 0, new Stack<>());
return res;
}
public void calNode(ListNode node, int index, Stack<Integer> stack) {
if(node == null) {
res = new int[index];
return;
}
calNode(node.next, index + 1, stack);
while(!stack.empty() && stack.peek() <= node.val)
stack.pop();
res[index] = stack.empty() ? 0 : stack.peek();
stack.push(node.val);
}