Sort a linked list using insertion sort.
链表的插入排序。和数组不同的是单链表是从前向后遍历的,所有使用从前向后插入元素的时候要找到第一个大于目标元素的位置,然后把目标元素节点插到其前面。
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
public class Solution {
public ListNode insertionSortList(ListNode head) {
if(head==null||head.next==null) return head;
ListNode dummy=new ListNode(0);
while(head!=null){
ListNode p=dummy;
while(p.next!=null&&p.next.val<=head.val){
p=p.next;}
ListNode tmp=head.next;
head.next=p.next;
p.next=head;
head=tmp;
}
return dummy.next;
}
}
上面的解法有一个缺陷是,每次寻找的时候都要从头开始,可以进行改进:
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
public class Solution {
public ListNode insertionSortList(ListNode head) {
if(head==null||head.next==null) return head;
ListNode dummy=new ListNode(0);
ListNode p=dummy;
while(head!=null){
if(p!=dummy&&p.val>head.val){
p=dummy;
}
while(p.next!=null&&p.next.val<=head.val){
p=p.next;}
ListNode tmp=head.next;
head.next=p.next;
p.next=head;
head=tmp;
}
return dummy.next;
}
}