给链表排序是面试中常考的一道题,今天总结一些经常链表排序的三种常用算法。分别是:快速排序、归并排序和插入排序。
快速排序
数组的快速排序相必大家都烂熟于心了,很简单,就是选定一个pivot,然后将大于等于pivot的排在pivot的右边,下雨pivot的排在pivot的左边。这样pivot的最终顺序就确定好了,接下来只需要对pivot的左边和右边执行相同的过程即可。
代码如下:
/**
* @author CLthinking
* @date 2019/8/1 下午 04:52
*/
public class ListQuickSort {
/**
* 单链表的快速排序
*/
public static ListNode quickSortList(ListNode root) {
return quickSortList(root, null);
}
/**
* 对begin开始,end(不包含)的单向链表排序
* @param begin
* @param end
* @return
*/
private static ListNode quickSortList(ListNode begin, ListNode end) {
if (begin == end || begin.next == end) {
return begin;
}
ListNode n = listPartition(begin, end);
quickSortList(n.next, end);
return quickSortList(begin, n);