原题链接:https://leetcode.cn/problems/next-greater-node-in-linked-list/
题解
基于单调栈的做法,不考虑这道题的链表情况,给定一个表,求每个元素的下一个更大元素都可以用单调栈的做法
逆序遍历这个表,每次遍历一个元素时检查栈,当栈顶元素≤当前元素时循环出栈
- 当出栈到栈顶元素>当前元素时,此时栈顶元素即为当前元素的下一个更大元素(此时栈顶元素没有被出栈,所以要用peek),然后将当前元素入栈
- 当出栈到栈空时,说明当前元素不存在下一个更大元素
那么唯一的问题就是如何逆序遍历链表了,这里我直接写了一段反转链表来实现
时间复杂度:O(N)
空间复杂度:O(N)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
| class Solution { public int[] nextLargerNodes(ListNode head) { int cnt=0; ListNode node=head,last=null,next;
Stack<ListNode> stack=new Stack<ListNode>(); while(node!=null){ cnt++; next=node.next; if(last!=null){ node.next=last; } last=node; if(next!=null){ node=next; }else{ head=node; break; } }
int[] ans=new int[cnt]; int i=cnt-1; node=head;
while(i>=0){ while(!stack.isEmpty()&&stack.peek().val<=node.val){ stack.pop(); } if(stack.isEmpty()){ ans[i]=0; }else{ ans[i]=stack.peek().val; } stack.push(node); node=node.next; i--; } return ans; } }
|