• 腾讯//排序链表


    在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序。

    示例 1:

    输入: 4->2->1->3
    输出: 1->2->3->4
    

    示例 2:

    输入: -1->5->3->4->0
    输出: -1->0->3->4->5
    /**
     * Definition for singly-linked list.
     * struct ListNode {
     *     int val;
     *     ListNode *next;
     *     ListNode(int x) : val(x), next(NULL) {}
     * };
     */
    class Solution {
    public:
        ListNode* findMiddle(ListNode* head){
            if(head!=nullptr&&head->next==nullptr)
                return head;
            if(head!=nullptr&&head->next!=nullptr&&head->next->next==nullptr)
                return head;
            ListNode* fast = head;
            ListNode* slow = head;
            while(fast->next!=nullptr&&fast->next->next!=nullptr){
                fast = fast->next->next;
                slow = slow->next;
            }
            return slow;
        }
        ListNode* merge(ListNode* first, ListNode* second){
            ListNode* head = new ListNode(0);
            head->next = first->val<=second->val?first:second;
            ListNode* tail = head;
            while(first!=nullptr&&second!=nullptr){
                if(first->val<=second->val){
                    tail->next=first;
                    tail=first;
                    first=first->next;
                }else{
                    tail->next=second;
                    tail=second;
                    second=second->next;
                }
            }
            if(first!=nullptr)
                tail->next=first;
            if(second!=nullptr)
                tail->next=second;
            return head->next;
        }
        ListNode* mergeSort(ListNode* head){
            if(head->next==nullptr)
                return head;
            auto mid = findMiddle(head);
            auto mid_next = mid->next;
            mid->next = nullptr;
            auto first = mergeSort(head);
            auto second = mergeSort(mid_next);
            return merge(first, second);
        }
        
        ListNode* sortList(ListNode* head) {
            if(head==nullptr || head->next==nullptr)
                return head;
            return mergeSort(head);
        }
    };
  • 相关阅读:
    每日一练leetcode
    每日一练leetcode
    每日一练leetcode
    springboot搭建过程
    每日一练leetcode
    每日一练leetcode
    每日一练leetcode
    安装 Redis 迎客
    windows系统上面如何后台执行程序 迎客
    jira的详细安装和破解 迎客
  • 原文地址:https://www.cnblogs.com/strawqqhat/p/10602479.html
Copyright © 2020-2023  润新知