Leetcode 链表解法

本文详细介绍了一系列链表操作的实现方法,包括链表的逆序、查找交点、检测环、划分元素、合并多个链表等核心算法。通过具体示例和代码解析,帮助读者深入理解链表数据结构的应用。
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

struct ListNode
{
    int val;
    ListNode* next;
    ListNode(int x):val(x),next(NULL){}
};

bool cmp1(const ListNode* a,const ListNode* b)
{
    return a->val < b->val;
}

class Solution
{
public:
    /***************************************************
    *  函数功能: 链表逆序 (不可申请额外空间)
    *  参数说明
    *
    *  日期:2018-06-09-16.25
    ***************************************************/
    ListNode* reverseList(ListNode* head)
    {
        ListNode* result=NULL;
        while(head)
        {
            ListNode* temp=head->next;
            head->next=result;
            result=head;
            head=temp;
        }
        return result;
    }
    /***************************************************
    *  函数功能:链表逆序(从m到n逆序,不可申请额外空间)
    *  参数说明
    *
    *  日期:2018-06-09-16.42
    ***************************************************/
    ListNode* reverseBetween(ListNode* head,int m,int n)
    {
        if(head==NULL || m<0 || m>n) return NULL;
        ListNode* result=head;
        ListNode* preStart=NULL;

        int len=n-m+1;
        while(head && --m)
        {
            preStart=head;
            head=head->next;
        }

        ListNode* Start=head;
        ListNode* PreEnds=NULL;

        while(len && head)
        {
            ListNode* temp=head->next;
            head->next=PreEnds;
            PreEnds=head;
            head=temp;
            len--;
        }
        Start->next=head;
        if(preStart)
        {
            preStart->next=PreEnds;
        }else
        {
            result=PreEnds;
        }

        return result;
    }

    /***************************************************
    *  函数功能: 求两个链表的交点
    *  参数说明
    *
    *  日期:2018-06-09-17.24
    ***************************************************/
    int Length_Link(ListNode* head)
    {
        int len=0;
        while(head)
        {
            len++;
            head=head->next;
        }
        return len;
    }
    ListNode* getIntersectionNode(ListNode* headA,ListNode* headB)
    {
        if(headA==NULL || headB==NULL) return NULL;
        int lenA=Length_Link(headA);
        int lenB=Length_Link(headB);
        cout<<"lenA "<<lenA<<"  lenB "<<lenB<<endl;
        int len=0;
        if(lenA>=lenB)
        {
            len=lenA-lenB;
            while(len-- && headA)
            {
                headA=headA->next;
            }

        }else
        {
            len=lenB-lenA;
            while(len-- && headB)
            {
                headB=headB->next;
            }
        }
        while(headB && headA)
        {
            if(headA==headB)
            {
                return headB;
            }
            headB=headB->next;
            headA=headA->next;
        }

        return NULL;
    }

    /***************************************************
    *  函数功能:  链表是否存在环,若有环,则返回环的起始节点,否则返回NULL
    *  参数说明
    *
    *  日期:2018-06-09-17.49
    ***************************************************/
    ListNode* detectCycle(ListNode* head)
    {
        ListNode* slow=head;
        ListNode* fast=head;
        int flag=0;
        while(fast && slow)
        {
            fast=fast->next;
            if(fast==NULL)
            {
                return NULL;
            }
            slow=slow->next;
            fast=fast->next;
            if(slow==fast)
            {
                flag=1;
                break;
            }
        }

        while(flag)
        {
            head=head->next;
            fast=fast->next;
            if(head==fast)
            {
                return fast;
            }

         }
         return NULL;

    }

    /***************************************************
    *  函数功能: 链表的划分,将所有小于X的节点放在大于或等于x的节点前,且保存这些节点的原来相对位置;
    *  参数说明
    *
    *  日期:2018-06-09-18.15
    ***************************************************/
    ListNode* partitionL(ListNode* head,int x)
    {
        ListNode  less_head(0);
        ListNode  more_head(0);
        ListNode* underX=&less_head;
        ListNode* overX=&more_head;

        while(head)
        {
            if(head->val < x)
            {
                underX->next=head;
                underX=head;
            }else
            {
                overX->next=head;
                overX=head;
            }
            head=head->next;
        }

        underX->next=more_head.next;
        overX->next=NULL;
        return less_head.next;
    }
    /***************************************************
    *  函数功能:2个排序链表的合并
    *  参数说明
    *
    *  日期:2018-06-09-19.20
    ***************************************************/
    ListNode* MergeTwoSort(ListNode* headA,ListNode* headB)
    {
        ListNode result(0);
        ListNode* res=&result;
        while(headA && headB)
        {
            if(headA->val <= headB->val)
            {
                res->next=headA;
                res=headA;
                headA=headA->next;
            }else
            {
                res->next=headB;
                res=headB;
                headB=headB->next;
            }
        }
        if(headA)
        {
            res->next=headA;
        }
        if(headB)
        {
            res->next=headB;
        }
        return result.next;
    }
    /***************************************************
    *  函数功能:多个链表的合并 时间复杂度0(knlogkn)
    *  参数说明
    *
    *  日期:2018-06-09-19.33
    ***************************************************/

    ListNode* mergeKLists(std::vector<ListNode*>& lists)
    {
        std::vector<ListNode*> result;
        for(int i=0;i<lists.size();i++)
        {
            ListNode* head=lists[i];
            while(head)
            {
                result.push_back(head);
                head=head->next;
            }
        }
        if(result.size()==0)
        {
            return NULL;
        }


       std::sort(result.begin(), result.end(),cmp1);
        for(int i=1;i<result.size();i++)
        {
            result[i-1]->next=result[i];
        }
        result[result.size()-1]->next=NULL;
        return result[0];

    }

    /***************************************************
    *  函数功能:多个链表的合并 时间复杂度0(knlogk)
    *  参数说明
    *
    *  日期:2018-06-10-08.51
    ***************************************************/
    ListNode* mergeKLists2(std::vector<ListNode*>& lists)
    {
        if(lists.size()==0) return NULL;
        if(lists.size()==1) return lists[0];
        if(lists.size()==2) return MergeTwoSort(lists[0],lists[1]);
        std::vector<ListNode*> l1;
        std::vector<ListNode*> l2;
        int mid=lists.size()/2;
        for(int i=0;i<mid;i++)
        {
            l1.push_back(lists[i]);
        }
        for(int i=mid;i<lists.size();i++)
        {
            l2.push_back(lists[i]);
        }
        ListNode* sub1=mergeKLists2(l1);
        ListNode* sub2=mergeKLists2(l2);
        return MergeTwoSort(sub1,sub2);
    }

};

基于数据驱动的 Koopman 算子的递归神经网络模型线性化,用于纳米定位系统的预测控制研究(Matlab代码实现)内容概要:本文围绕“基于数据驱动的 Koopman 算子的递归神经网络模型线性化,用于纳米定位系统的预测控制研究”展开,提出了一种结合数据驱动方与Koopman算子理论的递归神经网络(RNN)模型线性化方,旨在提升纳米定位系统的预测控制精度与动态响应能力。研究通过构建数据驱动的线性化模型,克服了传统非线性系统建模复杂、计算开销大的问题,并在Matlab平台上实现了完整的算仿真与验证,展示了该方在高精度定位控制中的有效性与实用性。; 适合人群:具备一定自动化、控制理论或机器学习背景的科研人员与工程技术人员,尤其是从事精密定位、智能控制、非线性系统建模与预测控制相关领域的研究生与研究人员。; 使用场景及目标:①应用于纳米级精密定位系统(如原子力显微镜、半导体制造设备)中的高性能预测控制;②为复杂非线性系统的数据驱动建模与线性化提供新思路;③结合深度学习与经典控制理论,推动智能控制算的实际落地。; 阅读建议:建议读者结合Matlab代码实现部分,深入理解Koopman算子与RNN结合的建模范式,重点关注数据预处理、模型训练与控制系统集成等关键环节,并可通过替换实际系统数据进行迁移验证,以掌握该方的核心思想与工程应用技巧。
基于粒子群算优化Kmeans聚类的居民用电行为分析研究(Matlb代码实现)内容概要:本文围绕基于粒子群算(PSO)优化Kmeans聚类的居民用电行为分析展开研究,提出了一种结合智能优化算与传统聚类方的技术路径。通过使用粒子群算优化Kmeans聚类的初始聚类中心,有效克服了传统Kmeans算易陷入局部最优、对初始值敏感的问题,提升了聚类的稳定性和准确性。研究利用Matlab实现了该算,并应用于居民用电数据的行为模式识别与分类,有助于精细化电力需求管理、用户画像构建及个性化用电服务设计。文档还提及相关应用场景如负荷预测、电力系统优化等,并提供了配套代码资源。; 适合人群:具备一定Matlab编程基础,从事电力系统、智能优化算、数据分析等相关领域的研究人员或工程技术人员,尤其适合研究生及科研人员。; 使用场景及目标:①用于居民用电行为的高效聚类分析,挖掘典型用电模式;②提升Kmeans聚类算的性能,避免局部最优问题;③为电力公司开展需求响应、负荷预测和用户分群管理提供技术支持;④作为智能优化算与机器学习结合应用的教学与科研案例。; 阅读建议:建议读者结合提供的Matlab代码进行实践操作,深入理解PSO优化Kmeans的核心机制,关注参数设置对聚类效果的影响,并尝试将其应用于其他相似的数据聚类问题中,以加深理解和拓展应用能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值