给定一个长度为 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
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/next-greater-node-in-linked-list 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解决思路:
下一个更大的,这种使用单调栈 比较好解决 我想着用map 发现链表中有重复元素 太复杂了 还是用单调栈比较简单
参考: https://leetcode-cn.com/problems/next-greater-node-in-linked-list/solution/5chong-jie-jue-fang-shi-tu-wen-xiang-jie-by-sdwwld/
解决方法:
fun nextLargerNodes(head: ListNode?): IntArray {
val result = mutableListOf<Int>()
var stack = LinkedList<Int>()
var cur = head
var i = 0
while (cur != null){
while (!stack.isEmpty() && cur.`val` > result[stack.peek()]) {
result[stack.pop()] = cur.`val`
}
stack.push(i++)
result.add(cur.`val`)
cur = cur.next
}
while (!stack.isEmpty()) {
result[stack.pop()] = 0
}
return result.toIntArray()
}
|