题目
给定一个单链表,把所有的奇数节点和偶数节点分别排在一起。请注意,这里的奇数节点和偶数节点指的是节点编号的奇偶性,而不是节点的值的奇偶性。
请尝试使用原地算法完成。你的算法的空间复杂度应为 O(1),时间复杂度应为 O(nodes),nodes 为节点总数。
示例 1:
输入: 1->2->3->4->5->NULL
输出: 1->3->5->2->4->NULL
示例 2:
输入: 2->1->3->5->6->4->7->NULL
输出: 2->3->6->7->1->5->4->NULL
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) {} };
生成两个新链表,现在开始遍历原链表,遍历到奇数就把这个节点添加到奇链表后,遍历到偶数就把这个节点添加到偶链表后。
【1,2,3,4,5,6,7,8】
奇链表:【1,3,5,7】
偶链表:【2,4,6,8】
最后把两个链表拼接起来为
【1,3,5,7,2,4,6,8】
对于链表【1,2,3,4,5,6,7,8】
创建两个指针a,b初始指向1,2
在最初需要记录2的索引,因为2是偶链表的开始,最后需要将奇链表的尾与偶链表的首拼接在一起。
ListNode* oddEvenList1(ListNode* head) { if (!head || !head->next)return head; //节点为空或者只有一个直接返回 ListNode* tail = head->next; ListNode* oddNode = head; //奇节点 ListNode* evenNode = head->next; //偶节点 while (evenNode && evenNode->next) { oddNode->next = evenNode->next; oddNode = oddNode->next; evenNode->next = oddNode->next; evenNode = evenNode->next; } oddNode->next = tail; return head; }