ListNode 2487. 从链表中移除节点,单调栈的应用

一、题目

1、题目描述

给你一个链表的头节点 head

移除每个右侧有一个更大数值的节点。

返回修改后链表的头节点head

2、接口描述

复制代码
cpp 复制代码
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* removeNodes(ListNode* head) {
        
    }
};

3、原题链接

2487. 从链表中移除节点


二、解题报告

1、思路分析

可见题目要求我们把原链表修改为一个非升序链表,那么我们只需要遍历一遍链表,维护一个单调栈存储节点,保证从栈底到栈顶单调递减,遍历完之后将栈中节点串联起来,栈底节点就是表头

2、复杂度

时间复杂度:O(n) 空间复杂度:O(1)

3、代码详解

复制代码
cpp 复制代码
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* removeNodes(ListNode* head) {
        if(!head || !(head -> next))
            return head;
        stack<ListNode*> s;
        s.push(head);
        head = head -> next;
        while(head)
        {
            while(s.size() && head -> val > s.top() -> val)
                s.pop();
            s.push(head);
            head = head -> next;
        }
        while(s.size())
        {
            s.top() -> next = head;
            head = s.top();
            s.pop();
        }        
        return head;
    }
};
相关推荐
偷吃的耗子20 分钟前
【CNN算法理解】:CNN平移不变性详解:数学原理与实例
人工智能·算法·cnn
dazzle1 小时前
机器学习算法原理与实践-入门(三):使用数学方法实现KNN
人工智能·算法·机器学习
那个村的李富贵1 小时前
智能炼金术:CANN加速的新材料AI设计系统
人工智能·算法·aigc·cann
张张努力变强2 小时前
C++ STL string 类:常用接口 + auto + 范围 for全攻略,字符串操作效率拉满
开发语言·数据结构·c++·算法·stl
万岳科技系统开发2 小时前
食堂采购系统源码库存扣减算法与并发控制实现详解
java·前端·数据库·算法
wWYy.2 小时前
数组快排 链表归并
数据结构·链表
张登杰踩2 小时前
MCR ALS 多元曲线分辨算法详解
算法
YuTaoShao2 小时前
【LeetCode 每日一题】3634. 使数组平衡的最少移除数目——(解法一)排序+滑动窗口
算法·leetcode·排序算法
波波0072 小时前
每日一题:.NET 的 GC是如何分代工作的?
算法·.net·gc
风暴之零2 小时前
变点检测算法PELT
算法