题目描述:Sort a linked list using insertion sort.
使用插入排序对链表进行排序
/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { * val = x; * next = null; * } * } */
public class Solution {
public ListNode insertionSortList(ListNode head) {
}
}
【思路】:使用插入排序
插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据,算法适用于少量数据的排序,时间复杂度为O(n^2)。是稳定的排序方法。插入算法把要排序的数组分成两部分:第一部分包含了这个数组的所有元素,但将最后一个元素除外(让数组多一个空间才有插入的位置),而第二部分就只包含这一个元素(即待插入元素)。在第一部分排序完成后,再将这个最后元素插入到已排好序的第一部分中。插入排序的基本思想是:每步将一个待排序的纪录,按其关键码值的大小插入前面已经排序的文件中适当位置上,直到全部插入完为止。
ListNode fakeNode=new ListNode(-1);
fakeNode.next=head;
if(head==null)
return null;
ListNode cur=head.next;//从第二个节点开始遍历
ListNode pre=head;//排好序的最后一个节点
while(cur!=null)
{
if(cur.val<pre.val)
{
ListNode nextNode=cur.next;//保存下一个需要遍历的节点
//寻找插入的合适位置
ListNode cur2=fakeNode.next;
ListNode temp=fakeNode;//记录cur2前面一个节点
while(cur.val>cur2.val&&cur2!=pre)
{
temp=cur2;
cur2=cur2.next;
}
//进行插入
temp.next=cur;
cur.next=cur2;
pre.next=nextNode;
//继续遍历下一个节点
cur=nextNode;
}
else {
pre=cur;
cur=cur.next;
}
}
return fakeNode.next;
//代码是参考自http://blog.csdn.net/u012249528/article/details/47151847