Middle-题目63:147. Insertion Sort List

本文介绍了一种使用插入排序算法对单链表进行排序的方法,并提供了完整的C语言实现代码。该方法通过逐个元素比较并插入到已排序部分来完成整个链表的排序。

题目原文:
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的碎碎念:
本题代码还是过于复杂,而且可以在有序区使用二分查找优化之。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值