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

京公网安备 11010502036488号