leetcode148--排序链表

在 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 *merge(ListNode* l1, ListNode* l2)
    {
         if (l1 == nullptr){
            return l2;
         }

        if (l2 == nullptr){
            return l1;
        }

        ListNode* root = new ListNode('#');
        ListNode* p = root;

        while (l1 != nullptr && l2 != nullptr)    
        {
            if (l1->val > l2->val){
                p->next = l2;
                l2 = l2->next;
            }
            else{
                p->next = l1;
                l1 = l1->next;
            }

            p = p->next;
        }

        if (l1 != nullptr){
            p->next = l1;
        }

        if (l2 != nullptr){
            p->next = l2;
        }

        return root->next;
       
    }
    
   ListNode* sortList(ListNode* head) {
        if (head == nullptr || head->next == nullptr)
        {
            return head;
        }
       
       ListNode* fast = head, *slow = head;
        
        //fast->next->next != nullptr &&fast->next != nullptr则会访问到未知内存
        while (fast->next != nullptr && fast->next->next != nullptr)
        {
            fast = fast->next->next;
            slow = slow->next;
        }

        fast = slow;
        slow = slow->next;
        fast->next = nullptr;

        fast = sortList(head);
        slow = sortList(slow);


        return merge(fast, slow);
    }
};

leetcode148--排序链表

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
       ListNode *merge(ListNode* l1, ListNode* l2)
    {
         if (l1 == nullptr){
            return l2;
         }

        if (l2 == nullptr){
            return l1;
        }

        ListNode* root = new ListNode('#');
        ListNode* p = root;

        while (l1 != nullptr && l2 != nullptr)    
        {
            if (l1->val > l2->val){
                p->next = l2;
                l2 = l2->next;
            }
            else{
                p->next = l1;
                l1 = l1->next;
            }

            p = p->next;
        }

        if (l1 != nullptr){
            p->next = l1;
        }

        if (l2 != nullptr){
            p->next = l2;
        }

        return root->next;
       
    }
    
   ListNode* sortList(ListNode* head) {
        if (head == nullptr || head->next == nullptr)
        {
            return head;
        }
       
       ListNode* fast = head, *slow = head, *p = nullptr;
        
        //fast->next->next != nullptr &&fast->next != nullptr则会访问到未知内存
        while (fast != nullptr && fast->next != nullptr)
        {
            p = slow;
            fast = fast->next->next;
            slow = slow->next;
        }

        p->next = nullptr;  //此处p是一个单一的节点
        fast = sortList(head);
        slow = sortList(slow);

        return merge(fast, slow);
    }
};

;