/** * 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)