这道题目是LeetCode147题,叫做链表的插入排序,一开始由于leetcode上面的链表不太一样,因为它的链表没有空的头结点,但是我们学校书上的链表都有空的头结点的,所以在代码中,我自己加了一个newhead作为新的头结点,写起来顺手一点。其中pre是指插入位置前面的那个节点,first指插入位置后面的那个节点,last是指已经排序好的链表中最后面的那一个节点,temp自然就是要进行插入的节点咯,代码就是每一层从第一个元素开始比较,符合条件的就插入到first节点和pre节点之间就好了。代码写的比较复杂的,时间复杂度虽然是O(n2),但是还是有点复杂,和leetcode上面大神写出来的代码还是有很大的差距,只能说好好改进吧。不喜勿喷。
public class t147 { public static ListNode insertionSortList(ListNode head) { if(head.next==null) return head; ListNode newhead=new ListNode(); newhead.next=head; ListNode pre=newhead; ListNode first=pre.next; ListNode last=pre.next; ListNode temp=newhead.next.next; while(temp!=null){ if(temp.val>=last.val){//如果插入节点比最后一个都要大,就不要插入了,更新就好 temp=temp.next; last=last.next; }else{ while(true){ if(temp.val<first.val){//找到插入位置 pre.next=temp; last.next=temp.next; temp.next=first; temp=last.next; //reset pre=newhead; first=newhead.next; break; }else{//没有找到,就后移继续找 pre=pre.next; first=first.next; } } } } return newhead.next; } }