leetcode刷题详解二

160. 相交链表

本质上是走过自己的路,再走过对方的路,这是求两个链表相交的方法

 ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {//本质上是走过自己的路,再走过对方的路if(headA == NULL|| headB == NULL){return NULL;}ListNode* temp_a = headA;ListNode* temp_b = headB;while(temp_a!=temp_b){if(temp_a == NULL){temp_a = headB;}else{temp_a = temp_a->next;}if(temp_b == NULL){temp_b = headA;}else{temp_b = temp_b->next;}}return temp_a;}

双指针法

情况一:两个链表相交。这个好判断

情况二:两个链表不相交。由于两个链表没有公共节点,两个指针也不会同时到达两个链表的尾节点,因此两个指针都会遍历完两个链表,指针pA 移动了m+n 次、指针pB 移动了 n+m 次之后,两个指针会同时变成空值null,此时返回null,满足循环条件。

⭕️206. 反转链表
ListNode* reverseList(ListNode* head) {if(head == nullptr){return head;}if(head->next == nullptr){return head;}ListNode *temp = reverseList(head->next);head->next->next = head;head->next = nullptr;return temp;}

上面这段代码是反转列表标准递归代码,也很好理解

21. 合并两个有序链表

使用迭代好理解。这道题第一反应就是四种种情况,全是空,一个是空,全不为空。

正常理解就是if,else if什么的,但是这样在写全不为空的时候很麻烦。

下面代码一个while(l1 && l2)就解决了上面的问题,很巧妙,很值得记住。必须全不为空才能进入循环,有一个是空指针就不能进入,这样代码好写很多很多

ListNode *head = new ListNode(-1);ListNode *pre = head;while(l1 && l2){ListNode* temp1 = l1;ListNode* temp2 = l2;if(l1->val >= l2->val){pre->next = l2;l2 = l2->next;}else{pre->next =l1;l1 = l1->next;}pre = pre->next;}if(l1 == nullptr){pre->next = l2;}if(l2 ==nullptr){pre->next = l1;}return head->next;}
141. 环形链表

思路:用快慢指针,如果是环形链表会相交

主要点在于while的循环条件,一定要针对快指针进行条件判断同时用&&而不是||

bool hasCycle(ListNode *head) {ListNode* fast = head;ListNode* slow = head;if(head == nullptr || head->next == nullptr){return false;}while(fast != nullptr && fast->next != nullptr){slow = slow->next;fast = fast->next->next;if(fast == slow){return true;}}return false;}
142. 环形链表 II

这道题自己画图就知道了,本质就是一道数学题

  1. 判断有无环

  2. fig1

    a+(n+1)b+nc=2(a+b)⟹a=c+(n−1)(b+c)

    即a=c

  3. 当第一次相遇时,快指针回到头结点,慢指针不动。两个指针按照相同速度走,相遇点即为环的入口点。

ListNode *detectCycle(ListNode *head) {ListNode* slow = head;        ListNode* fast = head;        while(fast && fast->next){           slow = slow->next;            fast = fast->next->next;            if(slow == fast){                fast = head;                while(fast != slow){                    fast = fast->next;                    slow = slow->next;                }                return fast;            }        }        return nullptr;    
}
19. 删除链表的倒数第 N 个结点

当碰到链表第几个节点的时候,双指针的思想可能正合适。

我们可以设想假设设定了双指针 p 和 q 的话,当 q 指向末尾的 NULL,p 与 q 之间相隔的元素个数为 n 时,那么删除掉 p 的下一个指针就完成了要求。

img
ListNode* removeNthFromEnd(ListNode* head, int n) {        //双指针思想,以后这种倒数的长度类型的题目都可以用双指针        ListNode* p = head;        ListNode* q = head;       while(n>0){            p = p->next;            n--;        }        if(!p){            return head->next;        }        while(p->next){            p = p->next;            q = q->next;        }        q->next = q->next->next;       return head;    
}
24. 两两交换链表中的节点

思路:交换节点的题,就要有temp->next和temp->next->next。

如果 temp 的后面没有节点或者只有一个节点,则没有更多的节点需要交换,因此结束交换。否则,获得 temp 后面的两个节点 node1(temp->next)和 node2(temp->next->next),通过更新节点的指针关系实现两两交换节点。

下面是错误代码

ListNode* swapPairs(ListNode* head) {        ListNode* temp = new ListNode(-1);        temp->next = head;        while(temp->next&&temp->next->next){           ListNode* l1 = temp->next;           ListNode* l2 = temp->next->next;           temp->next = l2;           l1->next =l2->next;           l2->next = l1;           temp = l1;        }        return head;    
}

输入:1,2,3,4

输出:1,4,3

错误原因:注意这道题head节点指的是首节点!这是最重要一点。其次,最开始head节点为1,在上面代码交换结束后正常来说为2,1,4,3,但是,head节点此刻还是1,如果返回head,则2被漏掉

正确代码

ListNode* swapPairs(ListNode* head) {        ListNode* temp = new ListNode(-1);        temp->next = head;       ListNode* dummy = temp;        while(temp->next&&temp->next->next){           ListNode* l1 = temp->next;           ListNode* l2 = temp->next->next;           temp->next = l2;           l1->next =l2->next;           l2->next = l1;           temp = l1;        }        return dummy->next;    
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/216981.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AssembleRH850.dll未能加载或找不到

AssembleRH850.dll未能加载或找不到 省流解决方案 省流 经过卸了反复重装、杀毒、系统dll修复,百般折腾,是这一堆东西在搞鬼。解决方案 下载DirectX修复工具(增强版),专门修复上述的C问题。

数字孪生技术:提升UI交互性与个性化设计

随着数字化时代的到来,数字孪生技术正在逐渐改变我们的生活和工作方式。数字孪生是一种复制现实世界系统或实体的技术,通过创建数字模型来模拟现实世界中的各种行为和事件。这种技术不仅为人们提供了一个全新的视角来看待和解决问题,同时也为…

HarmonyOS简述及开发环境搭建

一、HarmonyOS简介 1、介绍 HarmonyOS是一款面向万物互联时代的、全新的分布式操作系统。有三大系统特性,分别是:硬件互助,资源共享;一次开发,多端部署;统一OS,弹性部署。 HarmonyOS通过硬件互…

QT已有项目导入工程时注意事项

文章目录 从qt其他版本上开发的工程导入另一qt版本时 从qt其他版本上开发的工程导入另一qt版本时 这里以之前在qt5.12.2上开发的项目为例,现在到在qt6.5.3上运行。 不能直接导入IDE上,否则会报各种莫名奇妙的错误。 首先要把扩展名位.pro.user文件 删掉…

MySQL 及 SQL 注入

文章目录 前言什么是sql注入防止SQL注入Like语句中的注入后言 前言 hello world欢迎来到前端的新世界 😜当前文章系列专栏:Mysql 🐱‍👓博主在前端领域还有很多知识和技术需要掌握,正在不断努力填补技术短板。(如果出现…

Redis主从复制(新)

像一些大型的项目,为了保证系统的稳定性,会有一台Redis服务器专门作为主机(master),还会有多台服务器作为从机(slave),主机可专门用作写数据,然后根据配置和策略,自动将数据同步到从机,而从机专…

arp报文及使用go实现

一、ARP协议报文格式及ARP表 ARP(Address Resolution Protocal,地址解析协议)是将IP地址解析为以太网的MAC地址(或者称为物理地址)的协议。在局域网中,当主机或其他网络设备有数据要发送给另一个主机或设备…

2023 年 认证杯 小美赛 国际大学生数学建模挑战赛 |数学建模完整代码+建模过程全解全析

当大家面临着复杂的数学建模问题时,你是否曾经感到茫然无措?作为2022年美国大学生数学建模比赛的O奖得主,我为大家提供了一套优秀的解题思路,让你轻松应对各种难题。 cs数模团队在认证杯 小美赛前为大家提供了许多资料的内容呀&am…

小程序姓名:ssm+vue基本微信小程序的个人健康管理系统

项目介绍 首先,论文一开始便是清楚的论述了小程序的研究内容。其次,剖析系统需求分析,弄明白“做什么”,分析包括业务分析和业务流程的分析以及用例分析,更进一步明确系统的需求。然后在明白了小程序的需求基础上需要进一步地设计系统,主要包罗软件架构模式、整体功能模块、数…

Spark SQL 时间格式处理

初始化Spark Sql package pbcp_2023.clear_dataimport org.apache.spark.SparkConf import org.apache.spark.sql.SparkSession import org.apache.spark.sql.functions.{current_date, current_timestamp}object twe_2 {def main(args: Array[String]): Unit { //新建SparkC…

升级python后sudo apt-get update报错

sudo apt-get update 报错: sh: /usr/lib/cnf-update-db: /usr/bin/python3.7.5: bad interpreter: No such file or directory Reading package lists... Done E: Problem executing scripts APT::Update::Post-Invoke-Success if /usr/bin/test -w /var/lib/c…

Flash Attention:高效注意力机制的突破与应用

注意力机制彻底改变了自然语言处理和深度学习领域。它们允许模型在执行机器翻译、语言生成等任务时专注于输入数据的相关部分。 在这篇博客[1]中,我们将深入研究被称为“Flash Attention”的注意力机制的突破性进展。我们将探讨它是什么、它是如何工作的&#xff0c…