两种写法

写法一

比较啰嗦的写法,将链表分为两个部分去看待,一部分是有序的,一部分是无序的

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;
    }