2487. 从链表中移除节点
思路:方法一,模拟。先遍历一遍链表,把链表中的值存储在数组v当中,然后从后往前遍历数组v,更新最大值,然后进行比较。最后再遍历一遍链表,把可以选的节点都组合在一起。
/**
* 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) {
vector<int> v;
ListNode * tmp=head;
while(tmp){
v.push_back(tmp->val);
tmp=tmp->next;
}
int n=v.size();
int maxx=v[n-1];
for(int i=n-1;i>=0;i--){
if(maxx>v[i]){
v[i]=0;
}else{
maxx=max(maxx,v[i]);
v[i]=1;
}
}
ListNode * now=new ListNode(0);
tmp=now;
for(int i=0;i<n;i++){
if(v[i]){
tmp->next=head;
tmp=tmp->next;
}
head=head->next;
}
return now->next;
}
};
思路:方法二,栈。观察输出的结果会发现,都是单调递减的。那么我们可以用单调栈来保存符合要求的节点。
/**
* 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) {
stack<ListNode *> st;
while(head){
while(st.size()&&st.top()->val<head->val){
st.pop();
}
st.push(head);
head=head->next;
}
ListNode * now=new ListNode(0);
ListNode * tmp=nullptr;
while(st.size()){
tmp=st.top();
st.pop();
tmp->next=now->next;
now->next=tmp;
}
return now->next;
}
};