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(len(listnode))$
  • 空间复杂度$O(len(listnode))$

然后被丢弃节点的delete操作就靠力扣了hh。

AC代码

C++

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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

1
2
3
4
5
6
7
8
9
10
11
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


2487.从链表中移除节点
https://blog.letmefly.xyz/2024/01/03/LeetCode 2487.从链表中移除节点/
作者
Tisfy
发布于
2024年1月3日
许可协议