给定一个长度为 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.
* function ListNode(val, next) {
* this.val = (val===undefined ? 0 : val)
* this.next = (next===undefined ? null : next)
* }
*/
/**
* @param {ListNode} head
* @return {number[]}
*/
// 方法一:单调栈
var nextLargerNodes = function (head) {
const stack = []
// 先把链表转为数组
while (head) {
stack.push(head.val)
head = head.next
}
const answer = new Array(stack.length).fill(0)
const helpStack = []
for (let i = 0; i < stack.length; i++) {
// 单调栈判断栈顶下标的值小于当前时 进入
while (helpStack.length && stack[helpStack[helpStack.length - 1]] < stack[i]) {
let index = helpStack.pop()
answer[index] = stack[i]
}
helpStack.push(i)
}
return answer
};
// 方法二:链表
var nextLargerNodes = function (head) {
if (!head) return []
let ans = []
while (head) {
let temp = 0;
let cur = head.next;
while (cur) {
if (cur.val > head.val) {
temp = cur.val
break
}
cur = cur.next
}
ans.push(temp)
head = head.next
}
return ans
}
来源:力扣(LeetCode)
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。