Leetcode.2487 从链表中移除节点

题目链接

Leetcode.2487 从链表中移除节点 Rating : 1455

题目描述

给你一个链表的头节点 head

对于列表中的每个节点 node ,如果其右侧存在一个具有 严格更大 值的节点,则移除 node

返回修改后链表的头节点 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 , 1 0 5 ] [1, 10^5] [1,105]
  • 1 < = N o d e . v a l < = 1 0 5 1 <= Node.val <= 10^5 1<=Node.val<=105

解法:单调栈

对于 节点 n o d e i nodei nodei 如果后面存在 节点 n o d e j nodej nodej,使得 n o d e j − > v a l > n o d e i − > v a l nodej->val > nodei->val nodej>val>nodei>val,那么就删除节点 n o d e i nodei nodei

我们用 单调栈 完成。

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

C++代码:

class Solution {
public:
    ListNode* removeNodes(ListNode* head) {
        vector<int> stk;
        while(head){
            //stk.back() < head->val 说明当前节点值 head->val 更大,所以要删除 stk.back() 节点
            while(!stk.empty() && stk.back() < head->val) stk.pop_back();
            stk.push_back(head->val);
            head = head->next;
        }
        
        ListNode* cur = new ListNode(stk[0]);
        ListNode * p =cur;
        for(int i = 1;i < stk.size();i++){
            p->next = new ListNode(stk[i]);
            p = p->next;
        }
        return cur;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值