题解 | #单链表的排序#

单链表的排序

http://www.nowcoder.com/practice/f23604257af94d939848729b1a5cda08

题目
图片说明
题解:使用归并法,利用快慢指针找到链表中点进行归并

class Solution {
public:
    /**
     * 
     * @param head ListNode类 the head node
     * @return ListNode类
     */
    ListNode *mergeSort(ListNode* head)
    {
        if(!head->next)return head;
        ListNode *fast=head->next,*slow=head;//快慢指针
        while(fast && fast->next)
        {
            slow=slow->next;
            fast=fast->next->next;
        }
        ListNode *tmp=slow->next;//tmp为右边一半
        slow->next=nullptr;//切割成两半
        ListNode *l=mergeSort(head);//左边一半
        ListNode *r=mergeSort(tmp);//右边一半
        ListNode *res=new ListNode(0),*pre=res;
        while(l && r)//合并两个有序链表
        {
            if(l->val<=r->val)
            {
                pre->next=l;
                l=l->next;
                pre=pre->next;
            }
            else
            {
                pre->next=r;
                r=r->next;
                pre=pre->next;
            }
        }
        pre->next=l?l:r;
        return res->next;
    }
    ListNode* sortInList(ListNode* head) {
        // write code here
        return mergeSort(head);
    }
};
全部评论

相关推荐

28小凳也想实习:项目不用一个业务一个轮子吗,刷牛客好多人说要一业务一轮子
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务