题解 | #排序奇升偶降链表#

排序奇升偶降链表

http://www.nowcoder.com/practice/3a188e9c06ce4844b031713b82784a2a

step1. 先把链表拆分成两个,一个奇数节点的,一个偶数节点的
step2. 翻转偶数链表
step3. 合并两个链表

class Solution {
public:
    ListNode *sortLinkedList(ListNode *head) {
        if (head == nullptr || head->next == nullptr)
            return head;
        //step1. 先把链表拆分成两个,一个奇数节点的,一个偶数节点的
        ListNode *oddDummyHead = new ListNode(0);
        ListNode *evenDummyHead = new ListNode(0);

        ListNode *preOdd = oddDummyHead, *preEven = evenDummyHead;
        ListNode *curOdd = head, *curEven = head->next;
        while (curEven != nullptr && curEven->next != nullptr) {
            preOdd->next = curOdd;
            preEven->next = curEven;

            preOdd = curOdd;
            preEven = curEven;

            curOdd = curEven->next;
            curEven = curEven->next->next;
        }
        if (curEven == nullptr) {
            preOdd->next = curOdd;

            preEven->next = nullptr;
        } else if (curEven->next == nullptr){
            preOdd->next = curOdd;
            curOdd->next = nullptr;

            preEven->next = curEven;
        }


        //step2. 翻转偶数链表
        evenDummyHead->next = reverse(evenDummyHead->next);

        //step3. 合并两个链表
        ListNode *res = new ListNode(0);
        ListNode *curRes = res;
        curOdd = oddDummyHead->next, curEven = evenDummyHead->next;
        while (curOdd != nullptr && curEven != nullptr) {
            if (curOdd->val <= curEven->val) {
                ListNode *next = curOdd->next;

                curRes->next = curOdd;
                curRes = curRes->next;
                curOdd->next = nullptr;

                curOdd = next;
            } else {
                ListNode *next = curEven->next;

                curRes->next = curEven;
                curRes = curRes->next;
                curEven->next = nullptr;

                curEven = next;
            }
        }
        if (curOdd != nullptr) {
            curRes->next = curOdd;
        }
        if (curEven != nullptr) {
            curRes->next = curEven;
        }

        //返回结果
        return res->next;
    }

    ListNode *reverse(ListNode *head) {
        ListNode *prev = nullptr, *cur = head, *next = nullptr;

        while (cur != nullptr) {
            next = cur->next;

            cur->next = prev;

            prev = cur;
            cur = next;
        }

        return prev;
    }
};
全部评论

相关推荐

评论
点赞
1
分享

创作者周榜

更多
牛客网
牛客企业服务