题解 | #单链表的排序#

单链表的排序

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;
    }


#笔试刷题#
全部评论

相关推荐

不愿透露姓名的神秘牛友
07-09 12:23
转人工😡
门口唉提是地铁杀:五次握手了
点赞 评论 收藏
分享
一表renzha:不是你说是南通我都没往那方面想,人家真是想表达那个意思吗?
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
07-08 17:10
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务