【数据结构】LeetCode160.相交链表 138.随即链表复制 牛客——链表回文问题

【数据结构】LeetCode160.相交链表 138.随即链表复制 牛客——链表回文问题

文章目录

一、相交链表问题

问题描述

给定两个单链表,判断它们是否相交,若相交则返回相交的节点。(注意:判断依据是节点地址是否相同,而非节点值,因为节点值可能存在重复。)


在这里插入图片描述

解题思路分析

思路一:暴力遍历法
  • 方法:遍历链表A,对于A中的每一个节点,遍历整个链表B,检查是否存在地址相同的节点。
  • 时间复杂度:O(M*N)(若两链表长度分别为M和N)
  • 空间复杂度:O(1)
  • 缺点:效率低,不适用于长链表。
思路二:双指针对齐法(最优解)
  • 方法:
    1. 分别遍历两个链表,计算各自长度。
    2. 求出两链表长度差 gap
    3. 让较长的链表的指针先移动 gap 步。
    4. 然后两个指针同时移动,逐个比较节点地址,第一个相同的节点即为交点。
  • 时间复杂度:O(M + N)
  • 空间复杂度:O(1)
  • 优点:高效,适用于任意长度的链表。
在这里插入图片描述

思路2的时间复杂度更低,所以我们选择思路2

具体代码如下

structListNode*getIntersectionNode(structListNode*headA,structListNode*headB){structListNode* curA=headA,*curB=headB;int lenA=1,lenB=1;while(curA->next){ curA=curA->next; lenA++;}while(curB->next){ curB=curB->next; lenB++;}int gap=abs(lenA-lenB);//假设法 先假设A长structListNode* longList=headA;structListNode* shortList=headB;if(lenA<lenB){ longList=headB; shortList=headA;}while(gap--){ longList=longList->next;}while(longList){if(longList==shortList)return longList; longList=longList->next; shortList=shortList->next;}returnNULL;}

二、链表的回文结构

问题描述

判断一个单链表是否为回文结构。即正着读和反着读都一样

在这里插入图片描述

解题思路

回文链表判断的关键在于对称性验证。我们可以通过以下步骤实现:

  1. 找到中间节点:使用快慢指针法,快指针每次走两步,慢指针每次走一步,当快指针到达末尾时,慢指针正好在中间。
  2. 反转后半部分链表:从中间节点开始,将后半部分链表反转。
  3. 比较前后两部分:从头节点和反转后的中间节点开始,逐个比较节点值是否相同。

完整代码

class PalindromeList { public: //寻找中间节点 struct ListNode* middleNode(struct ListNode* head) { // 初始化快慢指针 struct ListNode* slow = head; struct ListNode* fast = head; // 移动指针直到fast到达链表末尾 while (fast != NULL && fast->next != NULL) { slow = slow->next; // 慢指针每次移动一步 fast = fast->next->next; // 快指针每次移动两步 } return slow; // 慢指针指向中间节点 } //反转链表 struct ListNode* reverseList(struct ListNode* head) { struct ListNode* n1, *n2, *n3; n1 = NULL; n2 = head; if (n2) n3 = n2->next; while (n2) { n2->next = n1; n1 = n2; n2 = n3; if (n3) n3 = n3->next; } return n1; } bool chkPalindrome(ListNode* A) { // write code here struct ListNode*mid=middleNode(A); struct ListNode*rmid=reverseList(mid); while(rmid&&A) { if(rmid->val!=A->val) return false; rmid=rmid->next; A=A->next; } return true; } }; 

三、 随即链表的复制

问题描述

实现一个函数,复制一个含有随机指针的链表。随机指针可以指向链表中的任何节点或为空。

在这里插入图片描述

解题思路

常规链表的复制很简单,但随机指针的存在使得问题复杂化。因为随机指针可能指向尚未复制的节点。我们可以通过以下三步解决:

  1. 插入拷贝节点:在原链表的每个节点后插入一个拷贝节点,值与原节点相同。
  2. 设置随机指针:拷贝节点的随机指针应指向原节点随机指针所指节点的下一个节点(即其拷贝)。
  3. 分离链表:将混合链表分离为原链表和拷贝链表。
在这里插入图片描述
structNode*copyRandomList(structNode* head){//拷贝节点插到原节点后边structNode*cur=head;while(cur){structNode* copy=(structNode*)malloc(sizeof(structNode));//分配内存 copy->next=cur->next; cur->next=copy; copy->val=cur->val; cur=copy->next;//cur走到原链表的下一个 }//控制random cur=head;while(cur){structNode* copy = cur->next;if(cur->random==NULL)//不要写成random==NULL{ copy->random=NULL;}else{ copy->random=cur->random->next;//核心代码} cur=copy->next;}//把拷贝链表尾插起来structNode* copyhead=NULL,*copytail=NULL; cur=head;while(cur){structNode*copy=cur->next;if(copytail==NULL){ copyhead=copytail=copy;}else{ copytail->next=copy; copytail=copytail->next;} cur=copy->next;}return copyhead;}

复杂度分析

  • 时间复杂度:O(N),三次遍历链表。
  • 空间复杂度:O(1),除了返回的拷贝链表外,仅使用了常数个额外指针。

Read more

MCP客户端与服务端初使用——让deepseek调用查询天气的mcp来查询天气

MCP客户端与服务端初使用——让deepseek调用查询天气的mcp来查询天气

本系列主要通过调用天气的mcp server查询天气这个例子来学习什么是mcp,以及怎么设计mcp。话不多说,我们开始吧。主要参考的是B站的老哥做的一个教程,我把链接放到这里,大家如果有什么不懂的也可以去看一下。 https://www.bilibili.com/video/BV1NLXCYTEbj?spm_id_from=333.788.videopod.episodes&vd_source=32148098d54c83926572ec0bab6a3b1d https://blog.ZEEKLOG.net/fufan_LLM/article/details/146377471 最终的效果:让deepseek-v3使用天气查询的工具来查询指定地方的天气情况 技术介绍 MCP,即Model Context Protocol(模型上下文协议),是由Claude的母公司Anthropic在2024年底推出的一项创新技术协议。在它刚问世时,并未引起太多关注,反响较为平淡。然而,随着今年智能体Agent领域的迅猛发展,MCP逐渐进入大众视野并受到广泛关注。今年2月,

By Ne0inhk
可以在命令行通过大模型使用上下文协议(MCP)与外部工具交互的软件:小巧的MCPHost

可以在命令行通过大模型使用上下文协议(MCP)与外部工具交互的软件:小巧的MCPHost

小巧的MCPHost MCPHost 可以在命令行下使用,使大型语言模型(LLM)能够通过模型上下文协议(MCP)与外部工具进行交互。目前支持Claude 3.5 Sonnet和Ollama等。本次实践使用自己架设的Deepseek v3模型,跑通了Time MCP服务。  官网:GitHub - mark3labs/mcphost: A CLI host application that enables Large Language Models (LLMs) to interact with external tools through the Model Context Protocol (MCP). 下载安装 使用非常方便,直接下载解压即可使用。官网提供Windows、Linux和MacOS三个系统的压缩包: https://github.com/

By Ne0inhk
实战篇:Python开发monogod数据库mcp server看完你就会了

实战篇:Python开发monogod数据库mcp server看完你就会了

原创不易,请关注公众号:【爬虫与大模型开发】,大模型的应用开发之路,整理了大模型在现在的企业级应用的实操及大家需要注意的一些AI开发的知识点!持续输出爬虫与大模型的相关文章。 前言 目前mcp协议是给deepseek大模型插上工具链的翅膀,让大模型不仅拥有超高的推理和文本生成能力,还能具备执行大脑意识的工具能力! 如何开发一个mcp? mcp是一种协议,指的是模型上下文协议 (Model Context Protocol)。 官方结成的mcp https://github.com/modelcontextprotocol/python-sdk mcp库 pip install mcp from mcp.server.fastmcp import FastMCP 我们先来做一个简单的案例 from mcp.server.fastmcp import FastMCP import requests mcp = FastMCP("spider") @mcp.tool() def crawl(

By Ne0inhk
【大模型实战篇】基于Claude MCP协议的智能体落地示例

【大模型实战篇】基于Claude MCP协议的智能体落地示例

1. 背景         之前我们在《MCP(Model Context Protocol) 大模型智能体第一个开源标准协议》一文中,介绍了MCP的概念,虽然了解了其概念、架构、解决的问题,但还缺少具体的示例,来帮助进一步理解整套MCP框架如何落地。         今天我们基于claude的官方例子--获取天气预报【1】,来理解MCP落地的整条链路。 2. MCP示例         该案例是构建一个简单的MCP天气预报服务器,并将其连接到主机,即Claude for Desktop。从基本设置开始,然后逐步发展到更复杂的使用场景。         大模型虽然能力非常强,但其弊端就是内容是过时的,这里的过时不是说内容很旧,只是表达内容具有非实时性。比如没有获取天气预报和严重天气警报的能力。因此我们将使用MCP来解决这一问题。         构建一个服务器,该服务器提供两个工具:获取警报(get-alerts)和获取预报(get-forecast)。然后,将该服务器连接到MCP主机(在本例中为Claude for Desktop)。         首先我们配置下环

By Ne0inhk