当前位置: 首页 > news >正文

yub‘s Algorithm Adventure Day6

链表相交

link:面试题 02.07. 链表相交 - 力扣(LeetCode)

思路分析

看到描述很直接的想到双指针,但是看到题解之后被K佬的神级理解折服,太妙了!

双指针
public class Solution {public ListNode getIntersectionNode(ListNode headA, ListNode headB) {ListNode curA = headA;ListNode curB = headB;int lenA = 0, lenB = 0;while (curA != null) { // 求链表A的长度lenA++;curA = curA.next;}while (curB != null) { // 求链表B的长度lenB++;curB = curB.next;}curA = headA;curB = headB;// 让curA为最长链表的头,lenA为其长度if (lenB > lenA) {//1. swap (lenA, lenB);int tmpLen = lenA;lenA = lenB;lenB = tmpLen;//2. swap (curA, curB);ListNode tmpNode = curA;curA = curB;curB = tmpNode;}// 求长度差int gap = lenA - lenB;// 让curA和curB在同一起点上(末尾位置对齐)while (gap-- > 0) {curA = curA.next;}// 遍历curA 和 curB,遇到相同则直接返回while (curA != null) {if (curA == curB) {return curB;}curA = curA.next;curB = curB.next;}return null;}}
升级版双指针

既然是计算相交节点,那么我们就会有公共节点.这里我们称之为node【是的如此普通】
image-20241006002319907

public class Solution {public ListNode getIntersectionNode(ListNode headA, ListNode headB) {ListNode A = headA;ListNode B = headB;while(A != B) {A = A != null ? A.next : headB;B = B != null ? B.next : headA;}return A;}
}
Tips

遇到无法定位的头节点或头节点可能被移动删除导致定位失效的情况才考虑虚拟头节点【比如删除某个下标节点等】
节点是一个实例 占用一块空间 值只是它的成员变量 值怎样和节点本身没有任何关系 一个实例只由它的地址唯一确定

删除链表中倒数第N个节点

link:19. 删除链表的倒数第 N 个结点 - 力扣(LeetCode)

思路分析

双指针加虚拟头节点.

class Solution {public ListNode removeNthFromEnd(ListNode head, int n) {ListNode dummy = new ListNode(-1);dummy.next = head;ListNode slow = dummy;ListNode fast = dummy;while (n-- > 0) {fast = fast.next;}// 记住 待删除节点slow 的上一节点ListNode prev = null;while (fast != null) {prev = slow;slow = slow.next;fast = fast.next;}// 上一节点的next指针绕过 待删除节点slow 直接指向slow的下一节点prev.next = slow.next;// 释放 待删除节点slow 的next指针, 这句删掉也能ACslow.next = null;return dummy.next;}
}

http://www.mrgr.cn/news/43583.html

相关文章:

  • Unity Shader Graph基础包200+节点及术语解释
  • 【每天学个新注解】Day 16 Lombok注解简解(十五)—@FieldNameConstants
  • Spring源码-AOP
  • Python中的自然语言处理:从基础到高级
  • A - Takahashi san 2 题解
  • 第二百六十九节 JPA教程 - JPA查询OrderBy两个属性示例
  • InnoDB 事务模型
  • 一刷代码随想录总结:
  • 如何向文科生解释什么是计算机的缓存
  • centos7安装配置nginx
  • 双指针:滑动窗口
  • [单master节点k8s部署]29.Istio流量管理(五)
  • golang gorm
  • 八大排序--01冒泡排序
  • 基于keras的停车场车位识别
  • GoogleNet原理与实战
  • 内存缓存和硬盘缓存
  • 如何实现事件流操作
  • Mysql数据库约束
  • 【信息系统项目管理师考题预测】整合管理