【LetMeFly】2487.从链表中移除节点:单调栈
力扣题目链接:https://leetcode.cn/problems/remove-nodes-from-linked-list/
给你一个链表的头节点 head
。
移除每个右侧有一个更大数值的节点。
返回修改后链表的头节点 head
。
示例 1:
输入:head = [5,2,13,3,8] 输出:[13,8] 解释:需要移除的节点是 5 ,2 和 3 。 - 节点 13 在节点 5 右侧。 - 节点 13 在节点 2 右侧。 - 节点 8 在节点 3 右侧。
示例 2:
输入:head = [1,1,1,1] 输出:[1,1,1,1] 解释:每个节点的值都是 1 ,所以没有需要移除的节点。
提示:
- 给定列表中的节点数目在范围
[1, 105]
内 1 <= Node.val <= 105
方法一:单调栈
维护一个单调递减栈(严格地说是单调非递增栈):
遍历链表,在
当前节点大于栈顶节点
时不断弹出栈顶节点,然后将当前节点入栈。
最终,从栈底到栈顶的元素就是非递增的了。因此也就得到了想要的链表。
- 时间复杂度 O ( l e n ( l i s t n o d e ) ) O(len(listnode)) O(len(listnode))
- 空间复杂度 O ( l e n ( l i s t n o d e ) ) O(len(listnode)) O(len(listnode))
然后被丢弃节点的delete操作就靠力扣了hh。
AC代码
C++
class Solution {
public:ListNode* removeNodes(ListNode* head) {stack<ListNode*> st;while (head) {while (st.size() && st.top()->val < head->val) {st.pop();}st.push(head);head = head->next;}ListNode* lastNode = nullptr;while (st.size()) {ListNode* thisNode = st.top();st.pop();thisNode->next = lastNode;lastNode = thisNode;}return lastNode;}
};
Python
class Solution:def removeNodes(self, head: ListNode) -> ListNode:st = []while head:while len(st) and st[-1].val < head.val:st.pop()st.append(head)head = head.nextfor i in range(len(st) - 1):st[i].next = st[i + 1]return st[0]
同步发文于CSDN,原创不易,转载经作者同意后请附上原文链接哦~
Tisfy:https://letmefly.blog.csdn.net/article/details/135357617