LeetCode_单调栈_中等_1019.链表中的下一个更大节点

目录

  • 1.题目
  • 2.思路
  • 3.代码实现(Java)

1.题目

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

示例 1:
LeetCode_单调栈_中等_1019.链表中的下一个更大节点_第1张图片

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

示例 2:
LeetCode_单调栈_中等_1019.链表中的下一个更大节点_第2张图片
输入:head = [2,7,4,3,5]
输出:[7,0,5,5,0]

提示:
链表中节点数为 n
1 <= n <= 104
1 <= Node.val <= 109

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/next-greater-node-in-linked-list

2.思路

(1)单调栈

相关题目:
LeetCode_单调栈_中等_739.每日温度

3.代码实现(Java)

//思路1————单调栈
/**
 * 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) {
        List<Integer> res = new ArrayList<>();
        //栈中的元素是一个长度为 2 的数组,存储结点序号以及对应的 val
        Deque<int[]> stack = new ArrayDeque<>();
        ListNode cur = head;
        int index = -1;
        while (cur != null) {
            index++;
            res.add(0);
            while (!stack.isEmpty() && stack.peek()[0] < cur.val) {
                res.set(stack.pop()[1], cur.val);
            }
            stack.push(new int[]{cur.val, index});
            cur = cur.next;
        }
        int size = res.size();
        int[] arr = new int[size];
        for (int i = 0; i < size; i++) {
            arr[i] = res.get(i);
        }
        return arr;
    }
}

你可能感兴趣的:(LeetCode,算法刷题,leetcode,单调栈)