链表的奇偶重排_牛客题霸_牛客网 (nowcoder.com)
双指针解决
/** * struct ListNode { * int val; * struct ListNode *next; * ListNode(int x) : val(x), next(nullptr) {} * }; */ class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param head ListNode类 * @return ListNode类 */ ListNode* oddEvenList(ListNode* head) { // write code here if(head == nullptr || head->next == nullptr) return head; ListNode* ji = head; //奇数指针 ListNode* oubegin = head->next; //保存偶数开头 之后奇偶合并使用 ListNode* ou = head->next; //偶数指针 while(ou != nullptr && ou->next != nullptr) { ji->next = ou->next; ji = ji->next; ou->next = ji->next; ou = ou->next; } ji->next = oubegin; //连接奇偶 return head; } };
- 时间复杂度:O(n),遍历一次链表的所有节点
- 空间复杂度:O(1),常数级指针,无额外辅助空间