1 """ 2 We are given a linked list with head as the first node. Let's number the nodes in the list: node_1, node_2, node_3, ... etc. 3 4 Each node may have a next larger value: for node_i, next_larger(node_i) is the node_j.val such that j > i, node_j.val > node_i.val, and j is the smallest possible choice. If such a j does not exist, the next larger value is 0. 5 6 Return an array of integers answer, where answer[i] = next_larger(node_{i+1}). 7 8 Note that in the example inputs (not outputs) below, arrays such as [2,1,5] represent the serialization of a linked list with a head node value of 2, second node value of 1, and third node value of 5. 9 10 11 12 Example 1: 13 14 Input: [2,1,5] 15 Output: [5,5,0] 16 17 Example 2: 18 19 Input: [2,7,4,3,5] 20 Output: [7,0,5,5,0] 21 22 Example 3: 23 24 Input: [1,7,5,1,9,2,5,1] 25 Output: [7,9,9,9,0,5,0,0] 26 27 """ 28 class ListNode: 29 def __init__(self, x): 30 self.val = x 31 self.next = None 32 class Solution1(object): 33 def nextLargerNodes(self, head): 34 if not head.next: 35 return head if head.val != 0 else None #判断头节点是为否为空 36 nums = [] 37 p = head 38 while(p): #将链表转为数组 39 nums.append(p.val) 40 p = p.next 41 stack = [] #创建一个栈 42 res = [0] * len(nums) #保存结果的数组 43 #bug 0 没有加[0] 44 for i, n in enumerate(nums): # 45 while stack and nums[stack[-1]] < n: #!!!单调递减的栈,栈中存的是索引 46 res[stack.pop()] = n 47 stack.append(i) #将索引压栈 48 return res 49 """ 50 runtime error 51 单调递减(增)栈,是一个非常普遍的解法 52 传送门https://blog.csdn.net/qq_17550379/article/details/86519771 53 """ 54 55 """ 56 我们也可以不将链表中的元素存放到一个list里面, 57 而是直接去处理链表,不过对于链表我们无法快速索引具体位置的值, 58 所以我们可以在stack中记录(index, val)数据对。 59 """ 60 class Solution2(object): 61 def nextLargerNodes(self, head): 62 res, stack = list(), list() 63 while head: 64 while stack and stack[-1][1] < head.val: 65 res[stack.pop()[0]] = head.val 66 stack.append([len(res), head.val]) 67 res.append(0) 68 head = head.next 69 return res