链表中的下一个更大节点

题目链接:链表中的下一个更大节点

O(N^2)的一种写法。

/**
 * 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) {
        vector<int> ans;
        ListNode *p,*q,*r;
        p = head;
        while(p){
            //解决p
            q = p->next;
            if(!q){
                ans.push_back(0);
            }else if(q->val > p->val){
                ans.push_back(q->val);
            }else{
                r = q->next;
                while(r && r->val <= p->val){   //比较耗费时间
                    r = r->next;
                }
                if(r){
                    ans.push_back(r->val);
                }else{
                    ans.push_back(0);
                }
            }
            p = q;
        }
        return ans;
    }
};

/***
1  5  4 5 9 9
5  9  5 9 0  0
*/

方法二:单调栈解法尝试下
时间复杂度:O(N)

/**
 * 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) {
        stack<pair<int,int> > st;   //first 下标,second值
        ListNode *p,*q,*r;
        p = head;
        vector<int> ans;
        int count = 0;
        while(p){
            ans.push_back(0);   //写进默认值
            while(!st.empty() && st.top().second < p->val){ //栈非空 且 当前结点的值比栈顶的值大 
                pair<int,int> myp = st.top();       //取出栈顶元素,(栈元素记录了 索引 和 值 )
                int index = myp.first;
                ans[index] = p->val;                //修改索引下的值
                st.pop();                           //出栈操作
            }
            //代码第一次运行到这里时 直接进栈处理
            st.push(make_pair(count++,p->val));
            p = p->next;
        }
        return ans;
    }
};

/**
维护一个 单调递减栈,一旦有元素大于栈顶元素的值,那么修改数组中元素的值。
更新(修改)的办法如下:
栈中存放的节点信息 
包括了结点的值 和 结点的下标 (自定义的下标,从0开始)
如果有p->val > 栈顶结点的值了,那么依照栈顶结点的下标在数组中进行修改即可。
*/

posted @ 2020-09-26 14:49  focusDing  阅读(178)  评论(0编辑  收藏  举报