对链表进行插入排序
插入排序算法:
插入排序是迭代的,每次只移动一个元素,直到所有元素可以形成一个有序的输出列表。
每次迭代中,插入排序只从输入数据中移除一个待排序的元素,找到它在序列中适当的位置,并将其插入。
重复直到所有输入数据插入完为止。
示例 1:
输入: 4->2->1->3
输出: 1->2->3->4
示例 2:
输入: -1->5->3->4->0
输出: -1->0->3->4->5
思路:
假定链表头结点为有序链表,取新链表节点对假定的有序链表进行插入排序。

如图

代码示例:
typedef struct ListNode Node;
struct ListNode* insertionSortList(struct ListNode* head){
if(head == NULL || head->next == NULL)
return head;
//sort链表头节点
Node* sorthead = head;
//新链表头
Node* newhead = head->next;
//解除sort链表和后续的连接。
sorthead->next = NULL;
Node* cur = newhead;
while(cur)
{ //保留next节点。
Node* next = cur->next;
if(cur->val < sorthead->val) //头插
{
cur->next = sorthead;
sorthead = cur;
}
else
{
Node* prev = sorthead;
Node* sortcur = sorthead->next;
//寻找插入节点。
while(sortcur && cur->val >= sortcur->val)
{
prev = sortcur;
sortcur = sortcur->next;
}
if(sortcur)
{
cur->next = sortcur;
prev->next = cur;
}
//如果为null,说明大于全部节点,进行尾插。
if(sortcur == NULL)
{
prev->next = cur;
cur->next = NULL;
}
}
cur = next;
}
return sorthead;
}
813

被折叠的 条评论
为什么被折叠?



