使用插入排序对单链表从小到大排序。
基本思想:对原链表中每个节点取出来放在新链表中排序插入。
- 带头接单的方法:
/**
* 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) {
//空链表或长度为1的链表不用排序
if(head == NULL || head->next == NULL) return head;
//建立一个头结点方便插入
ListNode * newhead = new ListNode(0);
ListNode *p = head;
while(p != NULL){
ListNode *ps = newhead;
//备份p节点的下一个节点
ListNode *p_bak = p->next;
while(ps->next != NULL && ps->next->val < p->val){
ps = ps->next;
}
p->next = ps->next;
ps->next = p;
p = p_bak;
}
return newhead->next;
}
};
2. 不带头结点:
ListNode *insertionSortList(ListNode *head) {
if(head == NULL || head->next == NULL) return head;
ListNode *p = head->next;
head->next = NULL;
while(p != NULL){
ListNode *p_bak = p->next, *ps = head, *psre = NULL;
while(ps != NULL && ps->val < p->val){
//为了能够插入,记录比较节点的前驱
psre = ps;
ps = ps->next;
}
p->next = ps;
//当插入节点值比第一个节点小的时候,前驱为NULL,重新设置head
if (psre == NULL)
head = p;
else{
psre->next = p;
}
p = p_bak;
}
return head;
}