力扣链表中的下一个更大节点(单调栈)

代码为什么有以下错误,找不出问题在哪,请大家帮忙看看
Line 1034: Char 34: runtime error: addition of unsigned offset to 0x6020000002f0 overflowed to 0x6020000002ec (stl_vector.h)
SUMMARY: UndefinedBehaviorSanitizer: undefined-behavior /usr/bin/../lib/gcc/x86_64-linux-gnu/9/../../../../include/c++/9/bits/stl_vector.h:1043:34

lass Solution {
public:
    vector<int> nextLargerNodes(ListNode* head) {
        ListNode *p=head;
        int len=0;
        vector<int>temp;
        
        while(p){
            temp.push_back(p->val);
            p=p->next;
            len++;
        }//得数组长度
        
        vector<int> res(len,0); // res用来储存结果,初始化为0提前处理好不满足条件位置的值
        vector<int> stack; // stack存放遍历过的元素的下标
        
        int top = -1; // top==-1时栈为空
        stack.push_back(0); // 入栈第一个元素的下标
        top++;
        for(int i=1; i<len; i++){ // 遍历temp同时将遍历过的值的下标储存在stack里
            if(temp[i] <= temp[stack[top]]){ // 当前遍历元素的值小于栈顶元素对应的值时将遍历元素的下标加入栈
                stack.push_back(i);
                top++;
            }else{ // 并处理栈顶元素,接着与后面的元素进行比较
                while(top != -1 && temp[i] > temp[stack[top]]){ // 栈不为空且当前遍历元素的值大于栈顶元素对应的值
                    res[stack[top]] = temp[i]; // 将当前遍历元素放入栈顶下标元素对应的位置即为栈顶元素位置的下一个节点值,将处理结果放入res。
                    stack.pop_back();
                    top--;
                }
            }   
        }
        
        return res;
    }
};


【以下回答由 GPT 生成】

原因分析:

根据错误信息,"runtime error: addition of unsigned offset to 0x6020000002f0 overflowed to 0x6020000002ec",这个错误发生在 stl_vector.h 文件的第 1043 行。根据错误信息,可能是在进行加法运算时,溢出导致的错误。

解决方案:

根据代码的逻辑,可能出现错误的地方是在 for 循环中的 while 循环。 在 while 循环中,每次调用 stack.pop_back()top-- 可能导致 top 的值为负数,从而使 vector<int> stack 访问了不合法的下标。

为了解决这个问题,我们需要在 while 循环中添加判断条件 top >= 0

以下是修改后的代码:

class Solution {
public:
    vector<int> nextLargerNodes(ListNode* head) {
        ListNode *p=head;
        int len=0;
        vector<int>temp;

        while(p){
            temp.push_back(p->val);
            p=p->next;
            len++;
        }//得数组长度

        vector<int> res(len,0); // res用来储存结果,初始化为0提前处理好不满足条件位置的值
        vector<int> stack; // stack存放遍历过的元素的下标

        int top = -1; // top== -1时栈为空
        stack.push_back(0); // 入栈第一个元素的下标
        top++;
        for(int i=1; i<len; i++){ // 遍历temp同时将遍历过的值的下标储存在stack里
            if(temp[i] <= temp[stack[top]]){ // 当前遍历元素的值小于栈顶元素对应的值时将遍历元素的下标加入栈
                stack.push_back(i);
                top++;
            }else{ // 并处理栈顶元素,接着与后面的元素进行比较
                while(top >= 0 && temp[i] > temp[stack[top]]){ // 添加判断条件,判断栈不为空且当前遍历元素的值大于栈顶元素对应的值
                    res[stack[top]] = temp[i]; // 将当前遍历元素放入栈顶下标元素对应的位置即为栈顶元素位置的下一个节点值,将处理结果放入res。
                    stack.pop_back();
                    top--;
                }
            }   
        }

        return res;
    }
};

希望以上解决方案能解决你的问题。如有其他疑问,请提前告知,我会尽力帮助你解决。



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^