LeetCode 2487. 从链表中移除节点:单调栈

【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++
cpp 复制代码
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
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.next
        for 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

相关推荐
weixin_307779131 小时前
一维无粘 Burgers 方程的激波形成问题:MacCormack 格式求解
c++·算法·matlab
HugoStudio_SWAN1 小时前
洛谷 B4500 / B4449 / B3843 凯撒密码、密码强度与密码合规——加密与安全的三道门
c++·学习·程序人生·算法·安全
枫叶林FYL2 小时前
【群体智能集群控制工程实践】第3章 一致性协同算法
算法
禹凕3 小时前
滑动窗口算法实战指南
python·算法
DisonTangor3 小时前
【腾讯混元雪耻归来】 Hy4 preview:770B 参数 MoE 旗舰模型,1M 上下文全面开源
人工智能·算法·开源·aigc·腾讯云·腾讯云ai代码助手
明月_清风4 小时前
从二叉树到 B+ 树:一文搞懂工程中「树」的演化之道
数据结构·算法·go
渡我白衣4 小时前
并查集:基础认识与模拟实现
android·java·javascript·数据结构·c++·算法·并查集
hetao17338374 小时前
2026-09-01~09-04 hetao1733837 的刷题记录
c++·算法
Evand J5 小时前
【MATLAB例程,图像滤波5】 反谐波均值滑动窗口滤波(CHMF)图像降噪与质量评价,附代码下载链接
图像处理·算法·计算机视觉·matlab·均值算法·滑动窗口滤波·均值滑动
血小板要健康5 小时前
链表 阶段算法总结
java·数据结构·笔记·算法·leetcode·链表