主要思想是维护一个排好序的序列,设置序列最后一个节点为lastNode,设置当前节点为curNode,将curNode插入到排好序的序列中,然后更新curNode,直到curNode到达链表的末尾,即curNode = null。
插入排序并没有我想象的那么简单,难的不是思想,难的是中间进行节点位置变换容易出错,主要注意设置lastNode和curNode,会让解题思路清晰很多
代码如下
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode insertionSortList(ListNode head) {
if(head == null || head.next == null) {
return head;
}
ListNode preHead = new ListNode();
preHead.next = head;
ListNode lastNode = head;
ListNode curNode = head.next;
while (curNode != null) {
if(lastNode.val > curNode.val) {
lastNode.next = curNode.next;
ListNode p = preHead.next;
ListNode prep = preHead;
while(p != lastNode && p.val < curNode.val) {
prep = p;
p = p.next;
}
prep.next = curNode;
curNode.next = p;
} else {
lastNode = lastNode.next;
}
curNode = lastNode.next;
}
return preHead.next;
}
}