题目描述
思路
此题是将原链表进行原地插入变为有序链表,可以取出头节点作为一个基准,从头节点往后,依次对比,适当使用头插、尾插、中间插入的办法。
解题方法
第一步,设置sortHead的头节点,以此作为基准
第二步,开始取节点比较,如果是比基准小则为头插,将节点头插进链表,再更新sotHead的头节点
第三步,比较的情况出现比头节点大的情况,因此设置sortCur,让cur的值与sortCur比较,sortCur永远比cur后进一位
第四步,出现比头节点大,比sortCur小的情况,属于中间插入,因此设置一个sortprev记录sortCur的前一位,cur插入这两位的中间
第五步,如果没有找到比sortCur小的节点,则需要将最后一位尾插进去,将cur->next置为空
代码实现
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
typedef struct ListNode Node;
struct ListNode* insertionSortList(struct ListNode* head) {
if(head==NULL || head->next==NULL)
{
return head;
}
Node* cur=head->next;
Node* sortHead=head;
sortHead->next=NULL;
while(cur)
{
Node* next=cur->next;
//1.将cur头插进链表的情况
if(cur->val <= sortHead->val)
{
cur->next=sortHead;
sortHead=cur;
}
//2.将cur中间插入的情况
else
{
Node* sortprev=sortHead;
Node* sortCur= sortprev->next;
//比较是否比sortCur的值大,找出中间插的位置
while(sortCur)
{
if(cur->val<=sortCur->val)
{
sortprev->next=cur;
cur->next=sortCur;
break;
}
else//没有找到则迭代
{
sortprev=sortCur;
sortCur=sortCur->next;
}
}
//如果找到最后一个,则将cur与前面链表连接起来
if(sortCur==NULL)
{
sortprev->next=cur;
cur->next=NULL;
}
}
//cur的迭代
cur=next;
}
return sortHead;
}