这道题要求的是对链表进行插入排序,算是一道简单的考察链表操作的题目。其中的难点在于未排序节点插入已排序节点时的三种不同情况:
1已排序部分头结点就大于要插入值 2已排序部分最后一节点还小于要插入值 3中间情况:要插入值在已排序值中间
下面的程序在插入排序的内层循环中,对上面三种情况进行分别处理:
/**
* 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) {
if (head==null||head.next==null){ //有了这步,以后只考虑最少两个节点的情况即可
return head;
}
ListNode lh=head;
ListNode rh=head.next;
head.next=null;
ListNode temp1=null;
ListNode temp2=null;
//外围循环
while(rh!=null){
lh=head;
//内层循环
while(lh.val<rh.val&&lh!=null&&lh.next!=null){
temp1=lh;
lh=lh.next;
}
//保存现在rh.next的值,因为一会rh指针会指向别处
temp2=rh.next;
//对内层while语句中三种不满足条件的情况分别进行处理:1已排序最后一位还小于要插入值 2头结点就大于要插入值 3要插入值在已排序值中间
if(lh.next==null&&lh.val<rh.val){
lh.next=rh;
rh.next=null;
}
else if(head.val>=rh.val){
head=rh;
head.next=lh;
}
else{
temp1.next=rh;
rh.next=lh;
}
//将rh置为刚才保存在temp2中的rh.next
rh=temp2;
}
return head;
}
}