【leetcode】328 Odd Even Linked List

题目说明

https://leetcode-cn.com/problems/odd-even-linked-list/description/
给定一个单链表,把所有的奇数节点和偶数节点分别排在一起。请注意,这里的奇数节点和偶数节点指的是节点编号的奇偶性,而不是节点的值的奇偶性。
请尝试使用原地算法完成。你的算法的空间复杂度应为 O(1),时间复杂度应为 O(nodes),nodes 为节点总数。

解法1

/*
 * 时间复杂度:O(n)
 * 用index来判断是是否为奇偶,记录最后一个奇数结点oddptr
 * 遍历链表将奇数结点插入到oddptr之后
 */
ListNode* oddEvenList(ListNode* head) {
    ListNode *pre = head;
    ListNode *oddptr = head;
    ListNode *cur = NULL;
    ListNode *cur_next = NULL;
    int index = 1;

    while(pre && pre->next){
        index ++;
        cur = pre->next;

        if (index % 2){
            cur_next = cur->next;
            cur->next = oddptr->next;
            oddptr->next = cur;
            pre->next = cur_next;
            oddptr = oddptr->next;
        } else{
            pre = pre->next;
        }
    }
    return head;
}

解法2

/*
 * 时间复杂度:O(n)
 * 用两个指针分别指向第一个结点first与第二个结点second,即第一个奇数结点与第一个偶数结点
 * first指向second的下一个结点,即第二个奇数结点,这样就将两个奇数结点串起来了,再将first向后移动一位
 * 同理second也指向第二个偶数结点,再将second后移
 * 如此循环,直到链表结束,就得到了奇数链表与偶数链表
 * 最后将最后一个奇数结点指向第一个偶数结点,将奇偶串起来,即完成链表重组。
 */
ListNode* oddEvenList2(ListNode* head) {
    if (head == NULL)
        return NULL;
    ListNode *first = head;
    ListNode *second = head->next;
    ListNode *temp = second;

    while(second && second->next){
        first->next = second->next;
        first = first->next;
        second->next = first->next;
        second = second->next;
    }
    first->next = temp;
    return head;
}

猜你喜欢

转载自www.cnblogs.com/JesseTsou/p/9570036.html