📅  最后修改于: 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();
}