问题分析
这题和 739. 每日温度 很像,不过有点不同的是第$739$题求的是下一个比他大的数的位置和当前数位置的差值,而这里求的是下一个比他大的数的值。还有一点就是第$739$题使用的是数组,而我们这道题使用的是链表。
所以我们完全可以参照第$739$题的做法,由于链表访问比较麻烦,需要从前往后一个个遍历,我们这里直接把链表转化为list
集合的方式来求解。我们不把链表转为数组,因为数组需要声明大小,而链表的大小我们是不知道的(如果先计算链表的长度再转化为数组感觉有点多余),我们直接把链表转化为list
集合。这样会更方便些。解题思路完全可以参照第739
题,我们来看下代码
暴力求解
public int[] nextLargerNodes(ListNode head) {
List<Integer> list = new ArrayList<>();
// 链表元素储存到集合中
while (head != null) {
list.add(head.val);
head = head.next;
}
int[] res = new int[list.size()];
for (int i = 0; i < list.size() - 1; ++i) {
for (int j = i + 1; j < list.size(); ++j) {
if (list.get(j) > list.get(i)){
res[i] = list.get(j);
break;
}
}
}
return res;
}
使用栈求解
public int[] nextLargerNodes(ListNode head) {
List<Integer> list = new ArrayList<>();
// 链表元素存储到集合中
while (head != null) {
list.add(head.val);
head = head.next;
}
// 栈中存储的是元素的下标,并且从栈底到栈顶元素在集合中对应的值是从大到小的
Stack<Integer> stack = new Stack<>();
int[] res = new int[list.size()];
for (int i = 0; i < list.size(); ++i) {
while (!stack.empty() && list.get(stack.peek()) < list.get(i)) {
// 如果栈顶元素对应的值小于当前值,说明栈顶元素遇到了比他大的
int index = stack.pop();
res[index] = list.get(i);
}
stack.push(i);
}
return res;
}