Day24: [LeetCode中等] 1019. 鏈表中的下一個更大節點
題源:
來自leetcode題庫:
https://leetcode-cn.com/problems/next-greater-node-in-linked-list/
思路:
我是先把鏈表轉存在數組中,然後逆序遍歷,用數組xiabiao來儲存下一個更大值的數組下標,若沒有就是-1。逆序遍歷的時候,比較和下一個的值的大小,若小於,則更改下就好;若大於或等於,則要按照xiabiao數組來和下一個更大值對比。
其實這道題應該用棧的,用棧效率更高。
代碼:
dirty code湊合看吧
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
vector<int> nextLargerNodes(ListNode* head) {
if(!head){
return vector<int>(0);
}else if(head->next==NULL){
return vector<int>(1,0);
}
auto p=head;
vector<int> res;
while(p){
res.push_back(p->val);
p=p->next;
}
int Len=res.size()-1;
vector<int> res2=res,xiabiao(Len+1,-1);
res2[Len]=0;
for(int i=Len-1;i>=0;i--){
if(res[i]<res[i+1]){
res2[i]=res[i+1];
xiabiao[i]=i+1;
}else{
if(res2[i+1]==0) {
res2[i]=0;continue;
}
int j;
for(j=xiabiao[i+1];j!=-1;j=xiabiao[j]){
if(res[i]<res[j]){
res2[i]=res[j];
xiabiao[i]=j;
break;
}
}
if(j==-1) res2[i]=0;
}
}
return res2;
}
};