1019. 链表中的下一个更大节点

24 阅读1分钟

给定一个长度为 n 的链表 head

对于列表中的每个节点,查找下一个 更大节点 的值。也就是说,对于每个节点,找到它旁边的第一个节点的值,这个节点的值 严格大于 它的值。

返回一个整数数组 answer ,其中 answer[i] 是第 i 个节点( 从1开始 )的下一个更大的节点的值。如果第 i 个节点没有下一个更大的节点,设置 answer[i] = 0 。

示例 1:

image.png

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

示例 2:

image.png

输入: 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)

链接:leetcode.cn/problems/ne…

著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。