147. 对链表进行插入排序
思路:对链表进行插入排序。
如果按照以往的插入排序的方法,应该是从前往后遍历所有的数,对每一个数从后往前插(比较大小),这样保证前面的数是有序的。但是在链表中,如果从该数的位置往前比较往往是困难的,因为单向链表适合从前往后遍历而不适合从后往前。因此,这里我们从前往后比较大小,找到合适的位置插入。
代码及注释如下:
public ListNode insertionSortList(ListNode head) {
ListNode dummy = new ListNode(0), pre;
dummy.next = head; //记录头部,牵住链表
while(head != null && head.next != null) {
if(head.val <= head.next.val) {//满足条件,直接过
head = head.next;
continue;
}
pre = dummy;//重新让pre从头开始
while (pre.next.val <= head.next.val) pre = pre.next;//找到pre.next.val > head.next.val的位置,此时需要将head.next插在pre的后面(pre.next的前面)
//将head.next(curr)插在pre的后面
ListNode curr = head.next;
head.next = curr.next;
curr.next = pre.next;
pre.next = curr;
}
return dummy.next;
}
148. 排序链表
思路:要求在O(nlogn) 时间复杂度和常数级空间复杂度下排序。
显然是要用到归并排序啦~
。。。待更新