Leetcode 148. 排序链表 C++

Leetcode 148. 排序链表

题目

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

测试样例

示例 1:
输入: 4->2->1->3
输出: 1->2->3->4
示例 2:
输入: -1->5->3->4->0
输出: -1->0->3->4->5

题解

归并排序的思想
用快慢指针找到中间的节点,归并排序的思想进行排序,详细过程见代码

代码

 ListNode* sortList(ListNode* head) {
        return sort(head);
    }
    ListNode* sort(ListNode* head){
        if(head==NULL || head->next==NULL)  return head;
        ListNode *slow=head,*fast=head,*bre=head;
        while(fast && fast->next){		//快慢指针找中间的节点,注意用一个指针指向中间元素的前一个节点
            fast = fast->next->next;
            bre = slow;
            slow = slow->next;
        }
        bre->next = NULL;		//将前一部分和后一部分分开
        ListNode* l1 = sort(head);
        ListNode* l2 = sort(slow);
        return merge(l1,l2);
    }
    ListNode* merge(ListNode* l1,ListNode *l2){		//两个以排序的链表进行插入式排序
        if(l1 == NULL)  return l2;
        if(l2 == NULL)  return l1;
        if(l1->val < l2->val){
            l1->next = merge(l1->next,l2);
            return l1;
        }else{
            l2->next = merge(l1,l2->next);
            return l2;
        }
    }

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/sort-list
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

你可能感兴趣的:(Leetcode 148. 排序链表 C++)