求解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
相关产品推荐
相关产品推荐

