148. 排序链表

先使用快慢指针将找到链表的中点,然后将链表切分成左右两部分,然后对左右指针递归进行排序,最后归并两个已经排序的链表。递归返回的条件是head->next==NULL;

class Solution {
public:
    ListNode* sortList(ListNode* head) { 
        if(head == NULL || head->next==NULL) return head;
        ListNode * slow = head,* fast = head,*pre = NULL;
        while(fast && fast->next){
            pre = slow;
            slow = slow->next;
            fast = fast->next->next;
        }
        pre->next = NULL;//断开
        return merge(sortList(head),sortList(slow));
    }
    
    ListNode * merge(ListNode *left,ListNode *right){
        ListNode *p = new ListNode(-1);
        ListNode *res = p;
        while(left!=NULL && right !=NULL){
            if(left->val <= right->val) {
                res->next = left;
                left = left->next;
            }else{
                res->next = right;
                right = right->next;
            }
            res = res->next;
        }
        
        if(left!=NULL) res->next = left;
        if(right!=NULL) res->next = right;
        //res = p->next;
        //free(p);
        //p=NULL;
        return p->next;
    }
}; 
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

友情链接更多精彩内容