一、题目
题目来源:https://leetcode-cn.com/problems/next-greater-node-in-linked-list/
给出一个以头节点 head
作为第一个节点的链表。链表中的节点分别编号为:node_1, node_2, node_3, ...
。
每个节点都可能有下一个更大值(next larger value):对于 node_i
,如果其 next_larger(node_i)
是 node_j.val
,那么就有 j > i
且 node_j.val > node_i.val
,而 j
是可能的选项中最小的那个。如果不存在这样的 j
,那么下一个更大值为 0
。
返回整数答案数组 answer
,其中 answer[i] = next_larger(node_{i+1})
。
注意:在下面的示例中,诸如 [2,1,5]
这样的输入(不是输出)是链表的序列化表示,其头节点的值为 2,第二个节点值为 1,第三个节点值为 5 。
- 示例 1:
输入:[2,1,5]
输出:[5,5,0]
- 示例 2:
输入:[2,7,4,3,5]
输出:[7,0,5,5,0]
- 示例 3:
输入:[1,7,5,1,9,2,5,1]
输出:[7,9,9,9,0,5,0,0]
- 提示:
对于链表中的每个节点,1 <= node.val <= 10^9
给定列表的长度在 [0, 10000] 范围内
二、题解
利用单调栈求解:
具体思想见笔者图示与代码注释
图示如下:
代码
func nextLargerNodes(head *ListNode) []int {
//首先遍历链表,将链表的值入数组arr
var arr []int
for head != nil{
arr = append(arr, head.Val)
head = head.Next
}
//定义最后的返回数组result和栈stack,长度为链表也就是arr的长度
//注意:go语言中int类型默认值为0,[]int,即默认为[0]
result, stack := make([]int, len(arr)), make([]int, len(arr))
//遍历数组arr
for index := 0; index < len(arr); index++{
//当栈为空的时候将数组下标入栈
//之所以入下标而不直接入值是为了在result中找到并修改对应index下标的位置
if len(stack) == 0{
stack = append(stack, index)
}else{
//如果栈中已有元素,那么开始循环比较
//若此时的index对应的值大于stack栈顶元素坐标对应的值,就将栈顶元素出栈
for len(stack) > 0 && arr[index] > arr[stack[len(stack)-1]]{
//将栈顶元素坐标赋给pop,用于出栈
pop := len(stack) - 1
//并改变result中对应栈顶元素坐标位置的值为index对应值(也就是当前最大值)
result[stack[pop]] = arr[index]
//弹出栈顶元素
stack = stack[:pop]
}
//循环完毕,直至栈中没有比index对应值更大的数,就将该最大值坐标index入栈
stack = append(stack, index)
}
}
//返回result
return result
}