Leetcode 1019:链表中的下一个更大节点(超详细的解法!!!)

版权声明:本文为博主原创文章,未经博主允许不得转载。有事联系:[email protected] https://blog.csdn.net/qq_17550379/article/details/88933410

给出一个以头节点 head 作为第一个节点的链表。链表中的节点分别编号为:node_1, node_2, node_3, ...

每个节点都可能有下一个更大值(next larger value):对于 node_i,如果其 next_larger(node_i)node_j.val,那么就有 j > inode_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. 对于链表中的每个节点,1 <= node.val <= 10^9
  2. 给定列表的长度在 [0, 10000] 范围内

解题思路

与这个问题类似的问题有

Leetcode 496:下一个更大元素 I(超详细的解法!!!)

Leetcode 503:下一个更大元素 II(超详细的解法!!!)

首先遍历链表将数据存放到list中,然后采用的单调递减栈解决(具体思路参考上面两篇和Leetcode 单调栈问题总结(超详细!!!)

class Solution:
    def nextLargerNodes(self, head: ListNode) -> List[int]:
        nums = list()
        while head:
            nums.append(head.val)
            head = head.next
            
        stack = list()
        res = [0]*len(nums)
        for i, n in enumerate(nums):
            while stack and nums[stack[-1]] < n:
                res[stack.pop()] = n
            stack.append(i)
        return res

我们也可以不将链表中的元素存放到一个list里面,而是直接去处理链表,不过对于链表我们无法快速索引具体位置的值,所以我们可以在stack中记录(index, val)数据对。

class Solution:
    def nextLargerNodes(self, head: ListNode) -> List[int]:
        res, stack = list(), list()
        while head:
            while stack and stack[-1][1] < head.val:
                res[stack.pop()[0]] = head.val
            stack.append([len(res), head.val])
            res.append(0)
            head = head.next
        return res

reference:

https://leetcode.com/problems/next-greater-node-in-linked-list/discuss/265508/JavaC%2B%2BPython-Next-Greater-Element

我将该问题的其他语言版本添加到了我的GitHub Leetcode

如有问题,希望大家指出!!!

猜你喜欢

转载自blog.csdn.net/qq_17550379/article/details/88933410
今日推荐