You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求解Odd Even Linked List时出现UndefinedBehaviorSanitizer错误如何解决

错误含义

这个报错是典型的未定义行为,触发原因是你访问了非法的、未正确初始化的指针指向的内存地址:
报错里的「member access within misaligned address」意思是程序尝试对一个不符合8字节对齐要求的野指针指向的地址做ListNode类型的成员访问,本质是你代码里的指针初始化逻辑有严重错误,用到了未赋值的野指针。

代码中的具体问题

你的代码存在多处指针逻辑错误:

  • ListNode* r = r; 属于完全错误的初始化写法,等于用未初始化的垃圾值给r赋值,r从一开始就是野指针,后续的r == nullptr判断完全不生效
  • 变量u初始赋值为l(也就是nullptr),后续没有任何修改,最终返回的u永远是空指针
  • 变量ru全程是nullptr,你没有保存奇数链表的头节点,最后拼接的时候找不到奇数链表的起点
  • 最后拼接逻辑写反了,应该是奇数链表的尾节点接偶数链表的头节点,而不是反过来
  • 不需要每次new新节点,直接修改原链表的指针即可,既节省空间也能避免额外的内存错误

修复方案

修正后的代码如下,直接在原链表上拆分奇偶链表再拼接即可:

/**
 * 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* oddEvenList(ListNode* head) {
        if (head == nullptr || head->next == nullptr) return head;
        // 分别保存奇数链表、偶数链表的头节点和遍历指针
        ListNode* oddHead = head;
        ListNode* evenHead = head->next;
        ListNode* odd = oddHead;
        ListNode* even = evenHead;
        // 遍历拆分节点
        while (even != nullptr && even->next != nullptr) {
            odd->next = even->next;
            odd = odd->next;
            even->next = odd->next;
            even = even->next;
        }
        // 奇数链表尾部拼接偶数链表头部
        odd->next = evenHead;
        return oddHead;
    }
};

内容的提问来源于stack exchange,提问作者nknkjdas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 23:54:04