题解 | #单链表的排序#

单链表的排序

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

相当于就是使用选择排序的,有几个关键点,1、就是使用一个dummy节点来记录每轮最小的元素,2、每次选择出一个最小的元素,然后将这个元素在head链表中剔除,这一步是必须要做的,不然排序就永远不可以结束,而且这样也可以减少排序的复杂度,3、注意删除已选中的节点时,需要保存两个信息:当前遍历节点的前置节点、已选中节点的前置节点,这样才能保证删除的正确性,4、需要注意几个细节:可能存在head节点就是最小的节点,所以在判断时需要预先判断一下是否和当前head一致,如果一致需要将head后推一个节点
   public ListNode sortInList(ListNode head) {
        ListNode dummy = new ListNode(-1), curd = dummy;
        while (head != null) {
            ListNode curSmallest = findSmallestNode(head);
            if (curSmallest == null) {
                return dummy.next;
            }
            if (curSmallest.equals(head)) {
                head = head.next;
            }
            curd.next = curSmallest;
            curd = curd.next;
        }
        return dummy.next;
    }

    private ListNode findSmallestNode(ListNode head) {
        ListNode sm = head, headPre = null, smPre = null;
        while (head != null) {
            if (sm.val > head.val) {
                smPre = headPre;
                sm = head;
            }
            headPre = head;
            head = head.next;
        }
        if (smPre != null) {
            smPre.next = sm.next;
            sm.next = null;
        }
        return sm;
    }


#笔试刷题#
全部评论

相关推荐

美团 后端开发 总包n(15%是股票)
点赞 评论 收藏
分享
拉丁是我干掉的:把上海理工大学改成北京理工大学。成功率增加200%
点赞 评论 收藏
分享
10-09 22:05
666 C++
找到工作就狠狠玩CSGO:报联合国演讲,报电子烟设计与制造
点赞 评论 收藏
分享
11-24 11:23
门头沟学院 C++
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务