328. 奇偶联表

题目

给定一个单链表,把所有的奇数节点和偶数节点分别排在一起。请注意,这里的奇数节点和偶数节点指的是节点编号的奇偶性,而不是节点的值的奇偶性。

请尝试使用原地算法完成。你的算法的空间复杂度应为 O(1),时间复杂度应为 O(nodes),nodes 为节点总数。

示例

输入: 1->2->3->4->5->NULL
输出: 1->3->5->2->4->NULL

审题

1. 逻辑上,奇偶index分开,也就是分成奇数链表和偶数链表,然后两个链表合并。
2. 空间复杂度O(1),不能创建新的链表。
3. 时间复杂度O(n),不能嵌套循环。

算法

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* oddEvenList(ListNode* head) {
        if (head == nullptr || head->next == nullptr) {
            return head;
        }

        ListNode* odd_node = head;              // 奇数链表
        ListNode* even_node = head->next;       // 偶数链表
        ListNode* even_node_head = even_node;   // 偶数链表头,链表合并使用
        while (odd_node->next != nullptr && even_node->next != nullptr) {
            // 奇数链表的next为原链接偶数index的next
            odd_node->next = even_node->next;
            odd_node = odd_node->next;

            // 偶数链表的next为原链接奇数index的next
            even_node->next = odd_node->next;
            even_node = even_node->next;
        }

        // 奇偶链表合并
        odd_node->next = even_node_head;

        return head;
    }
};

你可能感兴趣的:(328. 奇偶联表)