LeetCode 1019. Next Greater Node In Linked List
题目描述
给定一个长度为 n 的链表,对于列表中的每个节点,查找下一个更大节点的值。返回一个整数数组 answer,其中 answer[i] 是第 i 个节点下一个更大节点的值。如果第 i 个节点没有下一个更大节点的值,设置 answer[i] = 0。
例如:链表 [2,1,5] → 输出 [5,5,0]
- 节点 2:下一个更大的是 5
- 节点 1:下一个更大的是 5
- 节点 5:后面没有更大的,为 0
再如:链表 [2,7,4,3,5] → 输出 [7,0,5,5,0]
解题思路
本题是”下一个更大元素”问题的变种,只不过数据结构从数组变成了链表。核心思路依然是单调栈。
整体流程
链表转数组:首先遍历链表,将所有节点的值存入一个
ArrayList中,这样可以方便地通过下标随机访问。同时记录元素总数n。单调递减栈求解:使用一个单调递减栈(存储下标),从左到右遍历数组:
- 当栈不为空,且当前元素
nums.get(i)大于栈顶下标对应元素时:- 弹出栈顶下标
index,意味着节点index找到了下一个更大的值。 - 设置
answer[index] = nums.get(i)。
- 弹出栈顶下标
- 将当前下标
i入栈。
- 当栈不为空,且当前元素
遍历结束后,栈中剩余的下标对应的元素没有找到下一个更大的值,
answer数组中对应位置保持默认值0。
为什么用单调栈?
对于类似”找下一个更大/更小的元素”的问题,单调栈可以将暴力的 O(n²) 降低到 O(n)。核心思想是:
- 当遇到一个更大的元素时,栈中所有比它小的元素都在”等待”被匹配,一旦遇到更大的,就逐个结算。
- 栈的单调性保证了从未被弹出的元素不会被遗漏。
与 LeetCode 739 “每日温度” 的对比
本题与第 739 题几乎完全一致,唯一区别是数据来源是链表而非数组,以及”下一个更大”判定的对象是数值本身而非下标差值。解法思路完全相同:链表转数组 + 单调栈。
复杂度分析
- 时间复杂度:
O(n),其中n是链表长度。链表遍历一次,单调栈处理每个元素入栈出栈各一次,均为 O(n)。 - 空间复杂度:
O(n),需要存储数组形式的链表节点值以及单调栈,均为 O(n) 级别。
代码
1 | package code.J1019; |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 𝒞𝒶𝓃𝒶𝓇𝓎!