1019. 链表中的下一个更大节点
原题描述
给定一个长度为 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]
思路
- 将链表转换为等长的数组。
- 创建单调栈,维护栈内的元素保持非递增。
- 当元素比栈顶的元素大时,说明当前元素就是栈顶元素的下一个更大节点。
解题方法
1.创建和链表等长的链表
//计算链表长度
ListNode l = head;
int length = 0;
while (l!=null){
l=l.next;
length++;
}
//创建长度相同长度的数组
int[] ints = new int[length];
2.遍历链表,将链表的值存储到数组中,当当前元素比栈顶元素大时,说明当前元素就是栈顶元素的下一个更大节点。
// 保证栈中的数据非递增
Stack<Integer> stack =new Stack<>();
ListNode node = head;
//遍历链表
while (node!=null){
//把当前元素放入链表
ints[index]=node.val;
// 遇到比栈顶元素比当前元素小,则弹出
while (!stack.isEmpty()&&ints[stack.peek()]<ints[index]){
//弹出元素 说明当前元素是弹出元素的下一个更大节点
int c=stack.pop();
ints[c]=ints[index];
}
stack.add(index);
//处理下一个元素
node = node.next;
index++;
}
3.遍历链表结束,栈不为空,栈内的元素都是右面没有比它大的元素 直接赋值为0
while (!stack.isEmpty()){
int c=stack.pop();
ints[c]=0;
}
复杂度
-
时间复杂度: O(n)
-
空间复杂度: O(n)
Code
class Solution {
public static int[] nextLargerNodes(ListNode head) {
//计算链表长度
ListNode l = head;
int length = 0;
while (l!=null){
l=l.next;
length++;
}
//创建长度相同长度的数组
int[] ints = new int[length];
int index = 0;
// 保证栈中的数据非递增
Stack<Integer> stack =new Stack<>();
ListNode node = head;
//遍历链表
while (node!=null){
//把当前元素放入链表
ints[index]=node.val;
// 遇到比栈顶元素比当前元素小,则弹出
while (!stack.isEmpty()&&ints[stack.peek()]<ints[index]){
//弹出元素 说明当前元素是弹出元素的下一个更大节点
int c=stack.pop();
ints[c]=ints[index];
}
stack.add(index);
//处理下一个元素
node = node.next;
index++;
}
//遍历结束 栈不为空,栈内的元素都是右面没有比它大的元素 直接赋值为0
while (!stack.isEmpty()){
int c=stack.pop();
ints[c]=0;
}
return ints;
}
}