/**
 * struct ListNode {
 *	int val;
 *	struct ListNode *next;
 * };
 */
/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 * @author Senky
 * @date 2023.04.19
 * @par url https://www.nowcoder.com/creation/manager/content/584337070?type=column&status=-1
 * @param head ListNode类 
 * @return ListNode类
 */
struct ListNode* oddEvenList(struct ListNode* head ) {
    // write code here
    struct ListNode* odd_head = head;
    struct ListNode* odd_tail = head;

    struct ListNode* even_head = NULL;
    struct ListNode* even_tail = NULL;

    struct ListNode* odd_node = NULL;
    struct ListNode* even_node = NULL;
    
    if(head)
    {
        /*第一个奇结点不为NULL就有第一个偶结点(even_head可能是NULL)*/
        even_head = head->next;
        even_tail = even_head;
    } 

    if(even_head)
    {
        /*第一个偶结点不为NULL就会有第一个待链接的奇节点(odd_node可能为NULL)*/
        odd_node = even_head->next;
    }

    if(odd_node)
    {
        /*第一个待链接奇结点不为NULL就会有第一个待链接的偶节点(even_node可能为NULL)*/
        even_node = even_head->next;
    }
    
    while(odd_node || even_node)
    {
        if(odd_node)
        {
            /*链接下一个待链接奇结点并将奇链表表尾指向待链接的奇结点*/
            odd_tail->next = odd_node;
            odd_tail = odd_node;
            
            even_node = odd_node->next;//(待链接奇节点)的下一个是(待链接的偶结点)
            odd_tail->next = NULL;//奇链表从主链表中断开,尾插法加入奇结点
        }
        else 
        {
            odd_tail->next = even_head;
            even_node = NULL;
        }
        
        if(even_node) 
        {
            /*链接下一个待连接偶结点并将偶链表表尾指向待链接的偶结点*/
            even_tail->next = even_node;
            even_tail = even_node;

            odd_node = even_node->next;//(待链接偶结点)的下一个是(待链接的奇结点)
            even_tail->next = NULL;//偶链表从主链表中断开,尾插法加入偶结点
        }
        else 
        {   
            odd_tail->next = even_head;
            odd_node = NULL;
        }
    }
    return head;
}

Algorithm:

这题不用申请两个链表记录奇偶节点的值,我直接将原链表断开成两条奇偶链表因此空间复杂度O(1)