两种写法
写法一
比较啰嗦的写法,将链表分为两个部分去看待,一部分是有序的,一部分是无序的
public static ListNode insertionSortList(ListNode head) {
//start表示有序的开始
//end表示有序的结束
ListNode start=head;
ListNode end=head;
while(end.next!=null)
{
//获取到当前的第一个无序的元素
ListNode cur=end.next;
//如果当前和之前相比是有序的,就加入到其中,并进行下一次的操作
if(cur.val>=end.val)
{
end=end.next;
continue;
}
//如果是没有序的话,将这个元素单另出来
end.next=end.next.next;
//然后从有序的链表第一个开始
ListNode sort=start;
ListNode pre=null;
while(cur.val>sort.val)
{
pre=sort;
sort=sort.next;
}
//执行到这个位置的时候,在pre和pre.next之间就是要插入的位置
if(pre==null)
{
start=cur;//需要改头
cur.next=sort;
}else
{
pre.next=cur;
cur.next=sort;
}
}
return start;
}写法2
划分没有这么明确,单单是通过pre和cur的遍历
public static ListNode insertionSortList(ListNode head) {
ListNode pre=null;
ListNode cur=head;
while(cur!=null)
{
if(pre==null||pre.val<cur.val)//有序的话,直接周
{
pre=cur;
cur=cur.next;
}else if(pre.val>cur.val)//无序的话,从头开始比较
{
ListNode temp=head;
ListNode temppre=null;
while(temp.val<cur.val)
{
temppre=temp;
temp=temp.next;
}
pre.next=cur.next;
cur.next=temp;
if(temppre!=null)
{
temppre.next=cur;
}else
{
head=cur;
}
cur=pre.next;//注意每一次cur都要重置,否则就是死循环
}
}
return head;
}
京公网安备 11010502036488号