LeeCode 328. 奇偶链表
给定单链表的头节点 head
,将所有索引为奇数的节点和索引为偶数的节点分别分组,保持它们原有的相对顺序,然后把偶数索引节点分组连接到奇数索引节点分组之后,返回重新排序的链表。
第一个节点的索引被认为是 奇数 , 第二个节点的索引为 偶数 ,以此类推。
请注意,偶数组和奇数组内部的相对顺序应该与输入时保持一致。
你必须在 O(1)
的额外空间复杂度和 O(n)
的时间复杂度下解决这个问题。
示例 1:
输入: head = [1,2,3,4,5] 输出: [1,3,5,2,4]
示例 2:
输入: head = [2,1,3,5,6,4,7] 输出: [2,3,6,7,1,5,4]
提示:
n ==
链表中的节点数0 <= n <= 104
-106 <= Node.val <= 106
答案&测试代码:
void testLeeCode328(void) { // 奇偶链表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) { // LeeCode328.奇偶链表if (!head) return nullptr;ListNode *odd = head;ListNode *even = head->next;if (!even) return odd;odd->next = nullptr; // 奇数链表和偶数链表先断开链接ListNode* oddLast = odd; // 奇数链表的最后一个节点ListNode* evenLast = even; // 偶数链表的最后一个节点ListNode* newHead = evenLast->next; // 剩余未排序的链表头节点evenLast->next = nullptr; // 剩余链表和前面断开联系bool currIsOdd = true; // 标识当前是否应该添加奇数链表for (;newHead;) {// 取出剩余链表的头节点ListNode* next = newHead->next;newHead->next = nullptr;// 头节点添加到已排序好的链表里if (currIsOdd) {oddLast->next = newHead;oddLast = newHead;}else {evenLast->next = newHead;evenLast = newHead;}currIsOdd = !currIsOdd;newHead = next;}oddLast->next = even;return odd;}};// testSolution solution;ListNode node1 = ListNode(1);ListNode node2 = ListNode(2);ListNode node3 = ListNode(3);ListNode node4 = ListNode(4);ListNode node5 = ListNode(5);node1.next = &node2;node2.next = &node3;node3.next = &node4;node4.next = &node5;ListNode *res = solution.oddEvenList(&node1);// 打印链表std::cout << "链表:";for (ListNode* p = res; p;p = p->next) {std::cout << p->val << " ";}std::cout << endl;
}
打印:
ok. 提交到LeeCode:
ok.