题目原文:
Sort a linked list using insertion sort.
题目大意:
使用插入排序对单链表排序。
题目分析:
使用直接插入排序,即从第二个元素开始,每次寻找它应该在前面的有序区间内所在的位置。
源码:(language:c)
struct ListNode* insertionSortList(struct ListNode* head) {
if(!head || !head->next)
return head;
else {
struct ListNode* sortedHead = (struct ListNode*)malloc(sizeof(struct ListNode));
sortedHead->val = head->val;
sortedHead->next = NULL;
for (struct ListNode* node = head->next; node; node = node->next) {
if(node->val <= sortedHead->val) { // this node is smaller than the smallest node of sortedHead
struct ListNode* newNode = (struct ListNode*)malloc(sizeof(struct ListNode));
newNode->val = node->val;
newNode->next = sortedHead;
sortedHead = newNode;
}
else {
struct ListNode* temp;
for(temp = sortedHead; temp; temp = temp->next) {
if(temp->val <= node->val && (!temp->next || temp->next->val >node->val)) { //insert this node after temp
struct ListNode* newNode = (struct ListNode*)malloc(sizeof(struct ListNode));
newNode->val = node->val;
newNode->next = temp->next;
temp->next = newNode;
break;
}
}
}
}
return sortedHead;
}
}
成绩:
76ms,beats 25%,众数72ms,25%
cmershen的碎碎念:
本题代码还是过于复杂,而且可以在有序区使用二分查找优化之。