描述
用插入排序对链表排序
样例
样例 1:
输入: 0->null
输出: 0->null
样例 2:
输入: 1->3->2->0->null
输出 :0->1->2->3->null
代码部分
/**
* 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) {
// write your code here
// 这个dummy的作用是,把head开头的链表一个个的插入到dummy开头的链表里
// 所以这里不需要dummy.next = head;
ListNode dummy=new ListNode(0);
//head遍历当前链表元素
while(head!=null){
ListNode hnext=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=hnext;
}
return dummy.next;
}
}
补充说明
创建一个dummy链表,从head链表中依次向dummy链表中按插入排序规则添加节点。
下图中原链表其实是不用删除,只需要向后遍历即可,即图中原链表的头节点对应head节点。
每次dummy节点都需要遍历到最后一个小于head节点的值位置,这样head节点插入进来就保持了排序