LeedCode题库-148题-对链表进行升序排序

和刚刚做的题目一样,但是刚刚的147题是用插入排序罢了,但是这个题目,我们为了追求更快的速度,采用了归并排序的方法。这里为什么用归并排序呢,因为它的时间复杂度是O(nlogn),而其他常见的排序,比如快速排序,它的最坏情况是O(n2),不一定有归并排序快,而且它的partition还有点复杂,另外的堆排序也比较麻烦,因为leetcode题库里面他的链表数据就只有几个,用堆排序的空间复杂度比较大,因为它的空间复杂度,可能过不了审,所以也不采取堆排序的方法,然而其他常见的排序方法的时间复杂度基本上到了O(n2),所以这里我们采用归并排序的思想来实现这个题目,而且一般的小规模的排序问题一般都采用归并排序来实现。

归并排序本身是一种分治法的思想,将一个问题拆解成为子问题去解决,然后子问题的介又合并为原本问题的解。本题中,子问题通过递归来求解,代码第一行就是递归的出口。然后通过快慢指针来将原本的链表拆解成两个子链表,分别对子链表来排序,然后将子链表合并即可实现链表的排序。

public class t148 {
    public ListNode sortList(ListNode head) {
        if(head==null||head.next==null) return head;
        ListNode f=head.next;
        ListNode s=head;
        while(f!=null&&f.next!=null){//快慢指针求之间位置
            s=s.next;
            f=f.next.next;
        }
        
        ListNode newhead=s.next;//拆分
        s.next=null;
        ListNode left=sortList(head);
        ListNode right=sortList(newhead);
        ListNode ret=new ListNode(0);//合并之后保存结果的链表
        ListNode temp=ret;
        
        while(right!=null&&left!=null){//比较并连接,注意这里没有创建新的节点。
            if(right.val<left.val){
                temp.next=right;
                right=right.next;
            }else{
                temp.next=left;
                left=left.next;
            }
            temp=temp.next;
        }
        temp.next=(right==null?left:right);//三目运算符将后面没有比较的直接接上去
        return ret.next;
    }
}

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Leetcode题库是一个包含了各种算法和数据结构问的在线题库,供程序员练习和提升技能使用。这个题库中涵盖了大量的目,包括但不限于图遍历、最短路径、有效的括号、字符串解码、Z字形变换、最长公共前缀、字符串相乘、颠倒字符串中的单词、比较版本号、反转字符串、压缩字符串、验证IP地址等等。它提供了java实现的leetcode解法,这些解法的代码规范,可读性良好,并且其中的解法思想并不受语言限制。通过解决这些目,程序员可以提高自己的算法和编码能力。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [leetcode题库-leetcode-java:LeetcodeJava代码](https://download.csdn.net/download/weixin_38661100/19901136)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [LeetCode算法整理(200左右)](https://blog.csdn.net/qq_38253797/article/details/126827454)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值