题目描述很见到,不多介绍。一开始思路肯定去查看数组的插入排序;贴个普林斯顿大学——算法第四版的网上java代码库振振楼:http://algs4.cs.princeton.edu/home/
public static void sort(Comparable[] a) { int N = a.length; for (int i = 0; i < N; i++) { for (int j = i; j > 0 && less(a[j], a[j-1]); j--) { exch(a, j, j-1); } assert isSorted(a, 0, i); } assert isSorted(a); }
但是,他和基本的数组排序还是有区别的。链表是单向的,检索起来必须从头开始,所以这里必须重新设计;
受到高手代码启发:http://blog.youkuaiyun.com/worldwindjp/article/details/19067383
可以通过找前驱节点解决问题,但是觉得人家的设计过于繁琐,所以有了一下设计方案:
public class Solution { public ListNode insertionSortList(ListNode head) { if (head == null) return null; ListNode rehead = new ListNode(-1); rehead.next = head; ListNode pre = head; ListNode next = pre.next; while(pre.next != null) { if(next.val < pre.val) { ListNode tmp = rehead; while (tmp.next.val <= next.val) { tmp = tmp.next; } pre.next = next.next; next.next =tmp.next; tmp.next = next; next = pre.next; } else pre = pre.next; next = pre.next; } return rehead.next; } }
思路还是很简单的:
(1)两个前后关系的节点,不断往后遍历。
(2)在发现后者比前者大的时候,什么事情都不做;都往后走;
(3)在发现后者比前者小的时候,从前往后找可以插入位置的前驱节点,然后进行换位置;
换位置:pre的位置时不动的;next本身这个元素需要去tmp后面一个位置,然后next,重新记下pre后面一个位置;这样就可以重新检查;
是的效果确实蛮不错,哈哈!