LeetCode 24.两两交换链表中的节点

首先本题需要使用虚拟头节点,因为交换两个节点的操作时,cur指针一定要指向这两个节点的前一个节点,所以在完成一次交换之后,cur指针应该指向当前交换完成的两个节点中的后一个节点。其次因为需要断开两个节点,所以需要用两个temp指针来保存,具体需要保存的节点经过模拟发现一个时交换的前一个结点和后一个结点的next结点。
下面给出代码:

class Solution {public:ListNode* swapPairs(ListNode* head) {ListNode* dummyhead = new ListNode(0);dummyhead->next = head;ListNode* cur = dummyhead;while(cur->next != NULL && cur->next->next != NULL){ListNode* temp1 = cur->next;ListNode* temp2 = cur->next->next->next;cur->next = cur->next->next;cur->next->next = temp1;temp1->next = temp2;cur = cur->next->next;}return dummyhead->next;}
};

需要注意的是:while条件中注意判断顺序会导致空指针异常,需要先判断next再判断next的next。

LeetCode 19. 删除链表的倒数第 N 个结点

  1. 最暴力的方法就是,先反转,然后删除第n个结点,再反转即可。
  2. 第二种方法就是首先找到链表的长度len,然后删除第len - n个结点即可
  3. 第三种方法是卡哥的方法,使用双指针法,首先让fast先走n个结点,然后让快慢指针同时移动,当fast指向NULL时,就可以找到需要删除的结点。下面给出代码:
class Solution {public:ListNode* removeNthFromEnd(ListNode* head, int n) {ListNode* dummyhead = new ListNode(0);dummyhead->next = head;ListNode* fast = dummyhead;ListNode* slow = dummyhead;n = n + 1;while(n--){fast = fast->next;}while(fast != NULL){fast = fast->next;slow = slow->next;}ListNode* temp = slow->next;slow->next = slow->next->next;delete temp;return dummyhead->next;}
};

代码在处理细节的时候会有不同,不过只要是删除结点,使用虚拟头节点即可,最后让slow指针指向需要删除的结点的前一个结点。

面试题 02.07. 链表相交

本题还是使用双指针法,首先算出两个链表的长度,然后再进行指针移动。需要注意的是:

  • 只要两个指针指向的结点cura == curb就代表后续所有的结点都相同
  • 需要找到较长的那个链表,并让其先移动两个链表长度差值的长度

下面给出代码:

class Solution {public:ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {int sizea = 0;int sizeb = 0;ListNode* cura = headA;ListNode* curb = headB;while(cura != NULL){sizea++;cura = cura->next;}while(curb != NULL){sizeb++;curb = curb->next;}cura = headA;curb = headB;if(sizeb > sizea){swap(sizea,sizeb);swap(cura,curb);}int cnt = sizea -sizeb;while(cnt--){cura = cura->next;}while(cura != NULL){if(cura == curb){return cura;}cura = cura->next;curb = curb->next;}return NULL;}
};

注意这里直接使用swap()交换两个变量内存地址。

142.环形链表II

看过卡哥的视频后,此题分为两部分:

  • 判断链表是否为环形链表:使用双指针(快慢指针),快指针每次移动两格,满指针每次移动一格,如果为环形,那么快指针会在慢指针在环中未转完一圈的时候与慢指针相遇。
  • 找到环的入口:
    这里直接上卡哥的图!其实不难理解,只要自己模拟一遍就行。

总的处理逻辑就是,首先判断是否为环,如果为环,使两个指针分别在相遇点和head位置同时移动到相遇就是环的入口,直接给出代码:

class Solution {public:ListNode *detectCycle(ListNode *head) {ListNode* fast = head;ListNode* slow = head;while(fast != NULL && fast->next != NULL){fast = fast->next->next;slow = slow->next;if(fast == slow){ListNode* index1 = fast;ListNode* index2 = head;while(index1 != index2){index1 = index1->next;index2 = index2->next;}return index1;}}return NULL;}
};

这里外层while循环时也是要注意首先需要判断fast是否为NULL再判断他的next。

在AC完后查看提交记录,发现自己之前用hashmap AC过一次,自己都忘了,代码如下:

class Solution {public:ListNode *detectCycle(ListNode *head) {unordered_set<ListNode *> visited;while (head != nullptr) {if (visited.count(head)) {return head;}visited.insert(head);head = head->next;}return NULL;}
};

回忆了一下,就是遍历链表,遍历的时候将结点一个个存入hashmap中,如果遍历结束的话那么就直接返回NULL;如果在遍历过程中发现已经存入,就直接返回这个结点,这里使用unordered_set中的count()函数来查询。

代码随想录第四天 leetcode 24、19、206相关推荐

  1. 代码随想录(day04)-LeetCode:24、19、面试题02.07、142

    代码随想录:dayo4 1. [24]两两交换链表中的节点 虚拟头结点实现 递归实现 2.[19]**删除链表的倒数第N个节点** 双指针算法 3. 面试题[02.07]:链表相交 4.[142]环形 ...

  2. Leetcode刷题笔记(代码随想录)

    1 数组 1.1 二分查找 第一种写法:我们定义 target 是在一个在左闭右闭的区间里,也就是[left, right] .区间的定义这就决定了二分法的代码应该如何写,因为定义target在[le ...

  3. 代码随想录算法训练营第七天| 哈希表理论基础 ,454.四数相加II, 383. 赎金信, 15. 三数之和, 18. 四数之和

    代码随想录算法训练营第七天| 哈希表理论基础 ,454.四数相加II, 383. 赎金信, 15. 三数之和, 18. 四数之和 454.四数相加II 建议:本题是 使用map 巧妙解决的问题,好好体 ...

  4. 代码随想录算法训练营第二天|leetcode 977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II

    leetcode 977.有序数组的平方 想到昨天写的双指针,十分刻意用了一下,感觉还是比较生疏,还得加强练习和思考,然后发现还需要排序,想到了vector的排序sort(),但是觉得直接用不好,也忘 ...

  5. _42LeetCode代码随想录算法训练营第四十二天-动态规划 | 121.买卖股票的最佳时机、122.买卖股票的最佳时机II

    _42LeetCode代码随想录算法训练营第四十二天-动态规划 | 121.买卖股票的最佳时机.122.买卖股票的最佳时机II 题目列表 121.买卖股票的最佳时机 122.买卖股票的最佳时机II 1 ...

  6. 代码随想录算法训练营第七天| 454.四数相加II,383. 赎金信,15. 三数之和,18. 四数之和

    Leetcode 454.四数相加II 思路分析: 本题直观的想法是采取暴力法,四数相加就用四层for循环.虽然能得到结果,但时间复杂度为o(n4),当数组长度较大时,Leetcode便提示超时.该方 ...

  7. 代码随想录算法训练营day6| 454.四数相加II 383.赎金信 15.三数之和 18.四数之和

    代码随想录算法训练营day6| 454.四数相加II 383.赎金信 15.三数之和 18.四数之和 LeetCode 454 四数相加II 题目链接: 454.四数相加II class Soluti ...

  8. 代码质量随想录(四):排版,不只是为了漂亮

    代码质量随想录(四):排版,不只是为了漂亮 作者: 爱飞翔  发布时间: 2012-06-15 21:18  阅读: 1433 次  原文链接   全屏阅读 [收藏]   写了前三篇(一.二.三)之后 ...

  9. 代码随想录算法训练营第六天|454.四数相加II,383. 赎金信,15. 三数之和,18. 四数之和。

    代码随想录算法训练营第六天|454.四数相加II,383. 赎金信,15. 三数之和,18. 四数之和. 454.四数相加II 383. 赎金信 15. 三数之和 18. 四数之和 454.四数相加I ...

  10. 代码随想录算法训练营第⑦天 | 454.四数相加II ,383. 赎金信,15. 三数之和,18. 四数之和 9.30

    代码随想录算法训练营第⑦天 | 454.四数相加II ,383. 赎金信,15. 三数之和,18. 四数之和 9.30 454.四数相加II 可以先用2次for循环遍历前两个数组a,b 并存储到map ...

最新文章

  1. Oracle数据库名与Oracle实例名的关系
  2. 如何避免调参来自动选择神经网络结构?基于遗传算法的NAS最新进展
  3. opengl加载显示3D模型AC类型文件
  4. PHP stripos strpos,strpos()和stripos()函数的区别
  5. CSS3制作文字特效
  6. php多文件压缩的功能函数
  7. 程序员过关斩将-- 工作好多年可能还未真正了解接口和抽象类
  8. Maven使用技巧001--- 离线更新nexus中央仓库索引的方案
  9. 百度陆奇:AI是5G网络下最好的加速器,技术商业化还要更快
  10. C#—接口和抽象类的区别?
  11. jsonp 返回以前必须要再转一次json
  12. 霍夫曼编码计算图片压缩率
  13. app软件怎么申请软件著作权?
  14. word按标题自动生成序号
  15. 无线网经常短连接服务器,我家的无线网不稳定,经常掉线,每次玩游戏到加载的时候,总会出现:”无法连接服务器,请检查您的网络“...
  16. 前端工具-Rollup
  17. for循环的auto用法
  18. TCM和CACHE简述
  19. 合肥工业大学宣城校区2018年-2019年第一学期(大三上学期)物联网工程专业资料汇总(含课件、个人实验报告、实验代码、课设报告等)
  20. IE6绿色版本-IE Developer Toolbar可正常使用

热门文章

  1. matlab normx-x0_【 MATLAB 】norm ( Vector and matrix norms )(向量范数以及矩阵范数)
  2. Elasticsearch教程(31) es mapping参数doc_values enabled ignore_above norms store详解
  3. django-haystack 对 多对多字段( ManyToManyField )进行索引
  4. 虚拟机配置opc服务器,组态王怎么配置成opc服务器
  5. 2022年手机CPU性能天梯图排行榜 手机处理器排行榜 2022
  6. [阅读笔记] 联邦学习攻防综述 An Overview of Federated Deep Learning Privacy Attacks and Defensive Strategies
  7. 硬件设计与开发——如何提高自己的能力
  8. 农历和阳历互转(c语言)
  9. 生成器和生成器表达方式
  10. 为什么按序流动只可能出现RAW即写后读相关?