Every day a Leetcode
题目来源:2487. 从链表中移除节点
解法1:单调栈
遍历链表,建立一个单调栈(单调递减)。
再用头插法将单调栈的元素建立一个新的链表,返回该链表的头结点。
代码:
/*
* @lc app=leetcode.cn id=2487 lang=cpp
*
* [2487] 从链表中移除节点
*/
// @lc code=start
/**
* 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 == nullptr)
return head;
// 单调栈
stack<int> stk;
// 遍历链表
ListNode *p = head;
while (p)
{
while (!stk.empty() && stk.top() < p->val)
stk.pop();
stk.push(p->val);
p = p->next;
}
// 头插法建立单链表
ListNode *dummy = new ListNode(-1, nullptr);
while (!stk.empty())
{
ListNode *node = new ListNode(stk.top());
node->next = dummy->next;
dummy->next = node;
stk.pop();
}
return dummy->next;
}
};
// @lc code=end
结果:
复杂度分析:
时间复杂度:O(n),其中 n 是链表的节点个数。
空间复杂度:O(n),其中 n 是链表的节点个数。