[LeetCode] 147. 对链表进行插入排序
中等题,别看挺简单,能很快写出来代码蛮难的,后面可以用作面试考察题
大致思路遍历链表,对于每一次遍历i,将当前节点从链表上摘除,然后从链表开头到i节点:[head,i),寻找可以插入的位置。注意要处理边界情况:1. 可能插在了当前head节点前面 2. 当i节点的val比[head,i)中所有节点都大时,要插在了i的前面,此时注意更新i的pre节点
虽然是1A过的,但是调试也花了不少时间
public ListNode insertionSortList(ListNode head) {
if (head == null) {
return null;
}
ListNode i = head.next;
ListNode pre = head;
while (i!=null) {
pre.next = i.next;
ListNode tmp = head;
ListNode tmpPre = null;
while (tmp != pre.next) {
if (i.val <= tmp.val) {
if (tmpPre == null) {
head = i;
} else {
tmpPre.next = i;
}
i.next = tmp;
break;
} else {
tmpPre = tmp;
tmp = tmp.next;
}
}
if (i.val > pre.val) {
i.next = pre.next;
pre.next = i;
pre = pre.next;
}
i = pre.next;
}
return head;
}