用插入排序对链表排序
样例
Given 1->3->2->0->null
, return 0->1->2->3->null
解题思路:
创建一个dummy链表,从head链表中依次向dummy链表中按插入排序规则添加节点。
下图中原链表其实是不用删除,只需要向后遍历即可,即图中原链表的头节点对应head节点。
每次dummy节点都需要遍历到最后一个小于head节点的值位置,这样head节点插入进来就保持了排序
/**
* Definition for ListNode
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
public class Solution {
/**
* @param head: The first node of linked list.
* @return: The head of linked list.
*/
public ListNode insertionSortList(ListNode head) {
// 这个dummy的作用是,把head开头的链表一个个的插入到dummy开头的链表里
// 所以这里不需要dummy.next = head;
ListNode dummy = new ListNode(0);
//head遍历当前链表元素
while(head != null){
ListNode next = head.next;//next指向head的后一个元素
//node满足node.val<head.val && node.next.val>=head.val
//使得head可插入在node节点之后一个元素
ListNode node = dummy;
while(node.next != null && node.next.val < head.val)
node = node.next;
//将当前head元素添加进dummy链表,也就是插入node之后
head.next = node.next;
node.next = head;
//继续考察下一个head元素
head = next;
}
return dummy.next;
}
}