时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M 热度指数:48145
题目描述
使用插入排序对链表进行排序。
Sort a linked list using insertion sort.
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode *insertionSortList(ListNode *head) {
//链表头节点是有数据的
if(head==NULL||head->next==NULL){
return head;
}
ListNode nh=ListNode(0);//创建一个虚拟链表(节点)用于接收已排好续的
ListNode *h=&nh;
while(head){
//往链表插入需要知道(定义)两个节点(不断变化):目标位置和目标位置前一个结点即可
//而替换链表中的节点需要知道(定义)三个节点(不断变化):目标位置,目标位置前一个节点,及后一个节点
ListNode * p=h;//前一个节点
ListNode * q=h->next;
ListNode * cur=head;
head=head->next;
while(q&&cur->val>q->val){//如果是待排序链表的第一个,那么已排好链表只有一个节点(即创建的虚拟节点)
//因此无需比较直接插入
p=p->next;
q=q->next;
}
p->next=cur;
cur->next=q;
// head=head->next;不能放这里因为head(cur)已经被改变,必须在cur(head)改变前过渡到下一个
}
return h->next;
}
};