很简单,找到第一个逆序对,插入,注意头结点情况不同。然后如此反复即可。
注意Java中对象按引用传递,引用本身是按值传递的。
无附加头
public ListNode insertionSortList(ListNode head) { if(head == null || head.next == null) { return head; } ListNode currNode = head; while(currNode.next != null) { if(currNode.val <= currNode.next.val) { currNode = currNode.next; }else{ ListNode p = currNode.next; currNode.next = currNode.next.next; if(p.val < head.val) { p.next = head; head = p; }else{ ListNode tmp = head; while(p.val >= tmp.next.val) { tmp = tmp.next; } p.next = tmp.next; tmp.next = p; } } } return head; }
有附加头:
public ListNode insertionSortList(ListNode head) { if(head == null || head.next == null) { return head; } ListNode dummyNode = new ListNode(0); dummyNode.next = head; ListNode pNode = head; while (pNode.next != null) { if (pNode.val <= pNode.next.val) { pNode = pNode.next; }else { ListNode tmpNode = pNode.next; pNode.next = pNode.next.next; ListNode qNode = dummyNode; while (tmpNode.val >= qNode.next.val ) { qNode = qNode.next; } tmpNode.next = qNode.next; qNode.next = tmpNode; } } return dummyNode.next; }
可以看出有附加头的,把插入统一处理了,简化了操作。