给定一个长度为 n 的链表 head
对于列表中的每个节点,查找下一个 更大节点 的值。也就是说,对于每个节点,找到它旁边的第一个节点的值,这个节点的值 严格大于 它的值。
返回一个整数数组 answer ,其中 answer[i] 是第 i 个节点( 从1开始 )的下一个更大的节点的值。如果第 i 个节点没有下一个更大的节点,设置 answer[i] = 0 。
示例 1:

输入:head = [2,1,5] 输出:[5,5,0]
示例 2:

输入:head = [2,7,4,3,5] 输出:[7,0,5,5,0]
提示:
n1 <= n <= 1041 <= Node.val <= 109寻找下一个更大元素
- /**
- * Definition for singly-linked list.
- * public class ListNode {
- * int val;
- * ListNode next;
- * ListNode() {}
- * ListNode(int val) { this.val = val; }
- * ListNode(int val, ListNode next) { this.val = val; this.next = next; }
- * }
- */
- class Solution {
- private int n;
-
- public int[] nextLargerNodes(ListNode head) {
- //从右向左 查找下一个更大元素
- head = reverse(head);
- int[] ans = new int[n];
- Deque
st = new ArrayDeque<>(); - for (ListNode cur = head; cur != null; cur = cur.next) {
- while (!st.isEmpty() && st.peek() <= cur.val) {
- st.pop();
- }
- ans[--n] = st.isEmpty() ? 0 : st.peek();
- st.push(cur.val);
- }
- return ans;
- }
-
- public ListNode reverse(ListNode head) {
- ListNode pre = null;
- ListNode cur = head;
- while (cur != null) {
- ListNode nxt = cur.next;
- cur.next = pre;
- pre = cur;
- cur = nxt;
- n++;
- }
- return pre;
- }
- }
也可以使用递归倒序遍历
- /**
- * Definition for singly-linked list.
- * public class ListNode {
- * int val;
- * ListNode next;
- * ListNode() {}
- * ListNode(int val) { this.val = val; }
- * ListNode(int val, ListNode next) { this.val = val; this.next = next; }
- * }
- */
- class Solution {
- private int[] ans;
- private final Deque
st = new ArrayDeque<>(); -
- public int[] nextLargerNodes(ListNode head) {
- f(head, 0);
- return ans;
- }
-
- private void f(ListNode head, int i) {
- if (head == null) {
- ans = new int[i];
- return;
- }
- f(head.next, i + 1);
- while (!st.isEmpty() && st.peek() <= head.val) {
- st.pop();
- }
- if (!st.isEmpty()) {
- ans[i] = st.peek();
- }
- st.push(head.val);
- }
- }
更新下一个更大元素
- /**
- * Definition for singly-linked list.
- * public class ListNode {
- * int val;
- * ListNode next;
- * ListNode() {}
- * ListNode(int val) { this.val = val; }
- * ListNode(int val, ListNode next) { this.val = val; this.next = next; }
- * }
- */
- class Solution {
- public int[] nextLargerNodes(ListNode head) {
- int n = 0;
- for (ListNode cur = head; cur != null; cur = cur.next) {
- n++;
- }
- int[] ans = new int[n];
- Deque<int[]> st = new ArrayDeque<>();// 保存节点值和节点下标
- int i = 0;
- for (ListNode cur = head; cur != null; cur = cur.next) {
- while (!st.isEmpty() && st.peek()[0] < cur.val) {
- ans[st.pop()[1]] = cur.val;// 更新答案
- }
- st.push(new int[]{cur.val, i++});
- }
- return ans;
- }
- }
- /**
- * Definition for singly-linked list.
- * public class ListNode {
- * int val;
- * ListNode next;
- * ListNode() {}
- * ListNode(int val) { this.val = val; }
- * ListNode(int val, ListNode next) { this.val = val; this.next = next; }
- * }
- */
- class Solution {
- public int[] nextLargerNodes(ListNode head) {
- int n = 0;
- for (ListNode cur = head; cur != null; cur = cur.next) {
- n++;
- }
- int[] ans = new int[n];
- Deque
st = new ArrayDeque<>();// 保存节点下标 - int i = 0;
- for (ListNode cur = head; cur != null; cur = cur.next) {
- while (!st.isEmpty() && ans[st.peek()] < cur.val) {
- ans[st.pop()] = cur.val;// 更新答案
- }
- st.push(i);
- ans[i++] = cur.val;
- }
- for (var index : st) {
- ans[index] = 0;
- }
- return ans;
- }
- }