题解 | #单链表的排序#
单链表的排序
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; }