题目描述
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.
Examples:
Input: [2,1,5]
Output: [5,5,0]
Input: [2,7,4,3,5]
Output: [7,0,5,5,0]
Input: [1,7,5,1,9,2,5,1]
Output: [7,9,9,9,0,5,0,0]
Notes:
1 <= node.val <= 10^9 for each node in the linked list.
The given list has length in the range [0, 10000].
Code
1.
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public int[] nextLargerNodes(ListNode head) {
int[] data = new int[10001];
ListNode current = head;
ListNode p ;
int index = 0;
while(current != null){
p = current.next;
if(p == null){
data[index++] = 0;
}else{
while(p != null){
if(p.val > current.val){
data[index++] = p.val;
break;
}
p = p.next;
}
if(p == null){
data[index++] = 0;
}
}
current = current.next;
}
int[] res = new int[index];
for(int i = 0; i < index; ++i){
res[i] = data[i];
}
return res;
}
}
2.用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) {
//当前值比stack中的值大,则当前值是stack中值的期望值
while (!stack.isEmpty() && A.get(stack.peek()) < A.get(i))
res[stack.pop()] = A.get(i);
//如果当前值比stack中的值小,则直接将index入栈
stack.push(i);
}
return res;
}