代码随想录算法训练营第四天

本文介绍了LeetCode中涉及链表操作的三个问题解决方案:24题两两交换链表中的节点,使用虚拟节点和双指针技巧;19题删除链表的倒数第N个节点,利用快慢指针法;面试题链表相交,通过计算链表长度找交点。对于环形链表II的问题,文章未提供解答。
摘要由CSDN通过智能技术生成

题目:Leetcode 24 两两交换链表中的结点

思路: 

  1. 定义一个虚拟节点 dummy,并将其指向链表的头部。
  2. 定义一个指针 cur,初始时指向虚拟节点 dummy
  3. 进入循环,循环条件是当前节点的下一个节点和下下个节点都不为空。
  4. 在循环中,定义两个临时指针 temp1temp2,分别指向当前节点的下一个节点和下下个节点的下一个节点。
  5. 进行节点交换操作:
    • 将当前节点的下一个指针指向下下个节点。
    • 将下一个节点的下一个指针指向当前节点。
    • 将当前节点的下一个节点的下一个指针指向临时指针 temp2
  6. 更新指针 cur,使其指向交换后的新的当前节点,即下下个节点。
  7. 循环结束后,返回虚拟节点 dummy 的下一个节点作为新的链表头部。

总体来说,这个算法通过改变节点之间的指针连接顺序,将链表中相邻的两个节点进行交换。通过一个虚拟节点 dummy 辅助操作,可以简化对头节点的处理,最终返回交换后的链表头部。

题目:Leetcode 19 删除链表的倒数第N个结点

思路:

  1. 定义一个虚拟节点 dummy,并将其指向链表的头部。
  2. 定义两个指针 fastslow,初始时都指向虚拟节点 dummy
  3. 增加 n 的值,这是因为要删除倒数第 n 个节点,需要让 slow 指针指向待删除节点的前一个节点,而不是待删除节点本身。
  4. 进行第一个 while 循环,循环条件是 n 大于等于 0 并且 fast 不为空。
    • 在循环中,将 fast 指针向前移动,直到 n 的值减为 0 或者 fast 为空。
  5. 进行第二个 while 循环,循环条件是 fast 不为空。
    • 在循环中,将 fastslow 指针同时向前移动,直到 fast 为空。
    • 这样做的目的是将 slow 指针移动到待删除节点的前一个节点。
  6. 修改指针连接,将 slow 的下一个节点指向待删除节点的下一个节点,即跳过了待删除节点。
  7. 返回虚拟节点 dummy 的下一个节点作为新的链表头部。

总体来说,这个算法使用快慢指针的思想,在一次遍历中找到待删除节点的前一个节点,并进行删除操作。通过使用虚拟节点 dummy 辅助操作,可以简化对头节点的处理。最终返回删除倒数第 n 个节点后的链表头部。

题目:面试题 链表相交

思路: 

  1. 定义两个指针 ls,分别用于指向两个输入链表 headAheadB
  2. 计算链表 headAheadB 的长度分别为 lenAlenB
  3. 比较 lenAlenB 的大小,找出较长链表,并计算长度差,赋值给变量 gap
  4. 根据长度差,将指针 l 指向较长链表的头部,将指针 s 指向较短链表的头部。
  5. 使用 while 循环将指针 l 向后移动 gap 个节点,使得 ls 位于相同长度的位置上。
  6. 使用另一个 while 循环,同时遍历链表 ls,直到其中一个指针到达链表末尾。
    • 在循环中,比较当前 ls 指针指向的节点是否相同。
    • 如果相同,则找到了交点,返回该节点。
    • 如果不相同,则继续将两个指针向后移动一个节点。
  7. 如果没有找到交点,即循环结束后仍未返回,说明两个链表没有交点,返回 NULL

总体来说,这个算法通过计算链表长度和移动指针的方式,找到两个链表的交点。通过比较指针指向的节点来确定是否存在交点,并返回交点所在的节点

 题目:Leetcode 142 环形链表II

这题还是不会 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值