📜  链表中的下一个更大的元素(1)

📅  最后修改于: 2023-12-03 15:28:33.993000             🧑  作者: Mango

链表中的下一个更大的元素

链表中的下一个更大的元素是指在链表中对于每个元素x,找到下一个更大的元素y,使得y的值大于x的值,并且将y赋值给x的nextGreater节点。如果没有这样的下一个更大的元素,则将x的nextGreater节点赋值为null。

问题描述

给定一个链表,输出链表中每个节点的nextGreater节点。

示例 1:

输入: [2,1,5] 输出: [5,5,null]

解释: 2的下一个更大的数字是5; 1的下一个更大的数字是5; 5没有下一个更大的数字,因此下一个更大的数字为null。

示例 2:

输入: [2,7,4,3,5] 输出: [7,-1,5,5,null]

解释: 2的下一个更大的数字是7; 7没有下一个更大的数字,因此下一个更大的数字为null; 4的下一个更大的数字是5; 3的下一个更大的数字是5; 5没有下一个更大的数字,因此下一个更大的数字为null。

解题思路

使用单调栈(monotonic stack)来解决此问题。

我们可以尝试从头开始遍历这个链表,我们用一个栈来存储之前遍历到的节点。因此,当我们遍历到一个新节点时,我们需要将栈中所有元素与当前节点进行比较。如果栈中的元素小于当前节点,那么栈中所有小于当前节点的元素的下一个更大的节点都是当前节点。

复杂度分析

时间复杂度:O(n) 空间复杂度:O(n)

代码实现
class ListNode:
    def __init__(self, x):
        self.val = x
        self.next = None
        self.nextGreater = None

def nextLargerNodes(head: ListNode) -> List[int]:
    res = []
    stk = []

    while head:
        while stk and stk[-1].val < head.val:
            stk.pop().nextGreater = head.val
        
        stk.append(head)
        res.append(head.val)

        head = head.next

    for node in stk:
        node.nextGreater = None

    return res
public class ListNode {
    int val;
    ListNode next;
    ListNode nextGreater;
    ListNode(int x) { val = x; }
}

public int[] nextLargerNodes(ListNode head) {
    ArrayList<Integer> list = new ArrayList<>();
    Stack<ListNode> stack = new Stack<>();

    while (head != null) {
        while (!stack.isEmpty() && stack.peek().val < head.val)
            stack.pop().nextGreater = head.val;

        stack.push(head);
        list.add(head.val);

        head = head.next;
    }

    for (ListNode node : stack)
        node.nextGreater = 0;

    return list.stream().mapToInt(i -> i).toArray();
}