对链表插入排序,可以用两个指针p, q进行往后取结点操作;
开始如果head为空,直接返回NULL即可;
否则,让p指向head,q始终为p的下一个指针,这样每次对p操作后还能更新p为操作前的下一个指针,即q,同时也更新q为q->next。
开始让head为空,这样可以巧妙的不额外添加的哑巴节点,于是我们把第一个要插入的结点的操作与插入到链表首端的操作归到一起:
> p->next = head;(这就是head开始设为NULL的原因) > head = p; ```
如果不是插到链表首端,那么一定插入在head的后面,这时让t指向head,每次判断t->next的值与取出的结点p的值比较,直到p->val < t->next->val,那么p->val 必然满足p->val > t->val,所以使p插在t和t->next之间,同时一种特殊情况,如果p->val大于所有结点的值,那么p应该插入到最后面,此时t已经指向最后一个结点,我们判断如果最后t指向最后一个结点即t->next == NULL时,进行插入操作,我们可以这样想,插入到t与NULL之间,把NULL当作一个结点值无穷大的结点,把插入到最后的特殊情况与普通插入归类在一起
if (t->next == NULL || p->val < t->next->val) { p->next = t->next; t->next = p; break; } t = t->next; } ```
/**
* 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)
return NULL;
ListNode *p = head,*q = head->next;
head = NULL;
while(p){
if(!head || p->val < head->val){
p->next = head;
head = p;
}
else{
ListNode* t = head;
while(t){
if(t->next == NULL || p->val < t->next->val){
p->next = t->next;
t->next = p;
break;
}
t = t->next;
}
}
p = q;
if(q)
q = q->next;
}
return head;
}
};