Leetcode-每日一题【1019.链表中的下一个更大结点】
发布人:shili8
发布时间:2025-01-24 12:49
阅读次数:0
**LeetCode 每日一题1019: 链表中的下一个更大结点**
### 题目描述给定一个单链表的头节点 `head` 和一个整数 `k`,请设计一个算法来找到链表中第 k 个节点的下一个更大结点。
**示例1:**
输入:`head = [2,1,5]`, `k =2`
输出:`[7]`
解释:链表中的第二个节点是 `1`,其下一个更大结点是 `5`。
**示例2:**
输入:`head = [2,4,1,3]`, `k =3`
输出:`[-1]`
解释:链表中没有第3 个节点的下一个更大结点,因此返回 `-1`。
### 解决方案#### 方法一: 使用栈实现我们可以使用一个栈来存储链表中的元素。然后,我们可以从栈顶开始遍历链表,直到找到第 k 个元素。最后,我们可以从栈顶开始向下查找第 k 个元素的下一个更大结点。
class Solution: def nextLargerNodes(self, head: ListNode) -> List[int]: stack = [] result = [0] * len(nums) index =0 while head: # 将当前节点压入栈中 while stack and nums[stack[-1]] < nums[index]: # 如果栈顶元素小于当前元素,则弹出栈顶元素并更新结果 result[stack.pop()] = nums[index] # 将当前索引压入栈中 stack.append(index) index +=1 head = head.next return result
#### 方法二: 使用双指针实现我们可以使用两个指针分别指向链表的头部和尾部。然后,我们可以从头部开始遍历链表,直到找到第 k 个元素。最后,我们可以从尾部开始向下查找第 k 个元素的下一个更大结点。
class Solution: def nextLargerNodes(self, head: ListNode) -> List[int]: nums = [] while head: nums.append(head.val) head = head.next result = [0] * len(nums) for i in range(len(nums)): if i ==0: continue # 如果当前元素大于前一个元素,则更新结果 if nums[i] > nums[i -1]: result[i -1] = nums[i] return result
### 总结在本题中,我们需要找到链表中的第 k 个节点的下一个更大结点。我们可以使用栈或双指针实现来解决这个问题。方法一使用栈实现,方法二使用双指针实现。两种方法都能正确地找到第 k 个元素的下一个更大结点。
###代码注释* `nums` 是链表中的元素列表。
* `result` 是结果列表,用于存储每个元素的下一个更大结点。
* `stack` 是栈,用于存储链表中的元素。
* `index` 是当前索引,用于遍历链表。
### 时间复杂度时间复杂度为 O(n),其中 n 是链表中的元素数量。
### 空间复杂度空间复杂度为 O(n),其中 n 是链表中的元素数量。