LeetCode刷题笔记 148. 排序链表

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

题解

https://github.com/soulmachine/leetcode

常数空间且 O(nlogn),单链表适合用归并排序双向链表适合用快速排序。本题可以复
用”Merge Two Sorted Lists” 的代码。

class Solution {
public:
    ListNode* mergeTwoLists(ListNode *l1,ListNode *l2){
        ListNode dummy(-1);
        for(ListNode *p=&dummy;l1||l2;p=p->next){
            int val1=l1==nullptr?INT_MAX:l1->val; //这里必须是判断l1==nullptr,不能直接l1
            int val2=l2==nullptr?INT_MAX:l2->val;
            if(val1<=val2){
                p->next=l1;
                l1=l1->next;
            }else{
                p->next=l2;
                l2=l2->next;
            }            
        }
        return dummy.next;
    }
    ListNode* sortList(ListNode* head) {
        if(!head||!head->next) return head;

        //快慢指针找中间节点
        ListNode *fast=head,*slow=head;
        while(fast->next&&fast->next->next){
            slow=slow->next;
            fast=fast->next->next;
        }
        //断开
        fast=slow;
        slow=slow->next;
        fast->next=nullptr;

        ListNode *l1=sortList(head);
        ListNode *l2=sortList(slow);
        return mergeTwoLists(l1,l2);               
    }
};
发布了18 篇原创文章 · 获赞 0 · 访问量 1792

猜你喜欢

转载自blog.csdn.net/g534441921/article/details/104167078