148. 排序链表

本文介绍了一种基于归并排序算法的链表排序方法,该算法具备O(nlogn)的时间复杂度和O(1)的空间复杂度。通过在原链表上直接操作进行合并,以及在拆分过程中使用头节点进行n-1步操作,实现了高效的排序过程。文章详细解析了split和merge函数的实现细节。

nlog 的算法,是归并排序,同时是o1的空间复杂度,所以在merge的时候,直接在原链表上进行操作。在split的时候,由于包含head, 所以是走n-1步。

class Solution {

public:

    ListNode* merge(ListNode* l1, ListNode* l2){

            ListNode dummyhead(0);

            auto p = &dummyhead;

            while(l1 && l2){

                if(l1->val < l2->val){

                    p->next = l1;

                    p = l1;

                    l1 = l1->next;

                }

                else{

                    p->next = l2;

                    p = l2;

                    l2 = l2->next; 

                }

            }

            p->next = l1 ? l1 : l2;

            return dummyhead.next;

    }

    

    ListNode* split(ListNode* head, int n){

            ListNode* split = new ListNode(0);

            for(int i = 0; i < n-1 && head; i++){

                head = head->next;

            }

            //while(--n && head) head = head->next;

            if(!head) return NULL;

            split = head->next;

            head->next= NULL;

            return split;

    }

    

    ListNode* sortList(ListNode* head) {

            for(int i = 0; i < 2 && head; i++){

                cout << "i is:" << i << endl;

            }

            ListNode* dummyHead = new ListNode(0);

            dummyHead->next = head;

            ListNode* left = head; ListNode* right = head;

            ListNode* current = head;

            ListNode* p = head;

            int length(0);

            while(p) {length++; p=p->next;}

            //cout << length;

            for(int step = 1; step < length; step *= 2){

                //cout << "step" << step << endl;

                auto tail = dummyHead; 

                current = tail->next;

                while(current){

                    left = current;

                    right = split(left, step);

                    //cout << "right val" << right->val << endl;

                    current = split(right, step);

                    tail->next = merge(left, right);

                    while(tail->next) tail = tail->next;

                }

            }

        return dummyHead->next;

    }

};

数据驱动的两阶段分布鲁棒(1-范数和∞-范数约束)的电热综合能源系统研究(Matlab代码实现)内容概要:本文围绕“数据驱动的两阶段分布鲁棒(1-范数和∞-范数约束)的电热综合能源系统研究”展开,提出了一种结合数据驱动与分布鲁棒优化方法的建模框架,用于解决电热综合能源系统在不确定性环境下的优化调度问题。研究采用两阶段优化结构,第一阶段进行预决策,第二阶段根据实际场景进行调整,通过引入1-范数和∞-范数约束来构建不确定集,有效刻画风电、负荷等不确定性变量的波动特性,提升模型的鲁棒性和实用性。文中提供了完整的Matlab代码实现,便于读者复现和验证算法性能,并结合具体案例分析了不同约束条件下系统运行的经济性与可靠性。; 适合人群:具备一定电力系统、优化理论和Matlab编程基础的研究生、科研人员及工程技术人员,尤其适合从事综合能源系统、鲁棒优化、不确定性建模等相关领域研究的专业人士。; 使用场景及目标:①掌握数据驱动的分布鲁棒优化方法在综合能源系统中的应用;②理解1-范数和∞-范数在构建不确定集中的作用与差异;③学习两阶段鲁棒优化模型的建模思路与Matlab实现技巧,用于科研复现、论文写作或工程项目建模。; 阅读建议:建议读者结合提供的Matlab代码逐段理解算法实现细节,重点关注不确定集构建、两阶段模型结构设计及求解器调用方式,同时可尝试更换数据或调整约束参数以加深对模型鲁棒性的理解。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值