题目:
Sort a linked list using insertion sort.
分析:
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode insertionSortList(ListNode head) {
//链表的插入排序
//每次将列表中的最小插前面(已经有序)
if(head==null||head.next==null)return head;
//链表对折,分两部分
//tail用于表示后半部分,start用于记数,temp临时存储(类似pre)
ListNode tail=head,start=head,temp=null;
while(start!=null&&start.next!=null){
temp=tail;
tail=tail.next;
start=start.next.next;//比tail快一倍速度,正好将链表对折
}
//递归实现后半部分
ListNode l2=insertionSortList(tail);
//temp正好为tail的前一个,断链
temp.next=null;
//递归实现前半部分
ListNode l1=insertionSortList(head);
ListNode dummy=new ListNode(0);
ListNode cur=dummy;
//将前半部分和后半部分比较
while(l1!=null&&l2!=null){
if(l1.val<l2.val){
//插入cur
cur.next=l1;
l1=l1.next;
}else{
cur.next=l2;
l2=l2.next;
}
cur=cur.next;
}
//以防l1或l2还有节点
if(l1!=null) cur.next=l1;
if(l2!=null) cur.next=l2;
return dummy.next;
}
}