先上代码:
/**
* 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) {
if (head==null||head.next==null){
return head;
}
//1.构造出两条链表,一条是dummy:待插入链表;另一条cur:准备插入的结点链表
ListNode dummy=new ListNode(0);
dummy.next=head;
ListNode cur=head.next;
head.next=null;
//2.开始遍历cur,给每一个cur找到正确的位置
while (cur!=null){
ListNode temp=cur.next;//保存cur的下一个结点
ListNode pre=dummy;//每次都需要dummy开始遍历,给cur找确定位置
//给cur找到正确位置
while (pre.next!=null&&pre.next.val<cur.val){
pre=pre.next;
}
//找到之后插入
cur.next=pre.next;
pre.next=cur;
cur=temp;
}
return dummy.next;
}
}
举个例子:对于下面这个例子,构造出两个链表,然后将cur结点插入pre链表。思路很清晰了,debug两次就理解啦。