题意
单链表的插入排序
题解
1:边界条件判断,如果单链表中head为空或只有head,直接返回
2:设置一个结点指针p指向head的下一个结点,将head后的无序表断开,等待排序
3:while循环开始,先存储好下一个等待排序的结点nextNode,为不改变head指针指向,另外定义指针q指向head指针
4:如果p->val比有序表的头结点val小,则将p置为头结点,这一步排序完成(最好情况,保持可O(n))
5:否则从q开始寻找p应插入的位置,将p插入链表,注意链表的连接!
6:p指向下一个等待排序的结点nextNode,继续while循环直到所有结点被插入单链表
/**
* 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) { //将单链表按照val递增插入排序
if(head == NULL || head -> next == NULL) //头结点为空或链表中只有一个结点
{
return head;
}
ListNode* p = head -> next;
head -> next = NULL; //断开头结点后的链表
while(p != NULL)
{
ListNode* nextNode = p -> next; //存储下一个等待被插入的结点
ListNode* q = head; //先将p与链表的头结点比较val大小,但是又不改变头结点指针
if(p -> val < q -> val) //如果p->val比有序表的头结点val小,则将p置为头结点
{
p -> next = q; //p->next指向q(原头结点)
head = p; //保持head一直指向新有序表的头结点
}
else
{
while(q != NULL && q -> next != NULL && q -> next -> val <= p -> val)
q = q -> next;
p -> next = q -> next; //将结点P插入q的pre位置,连接链表
q -> next = p;
}
p = nextNode;
}
return head;
}
};