题目
给定一个长度为 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]
提示:
- 链表中节点数为
n
1 <= n <= 104
1 <= 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<Integer> 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<Integer> 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<Integer> 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;
}
}