首页 > 编程语言 >代码随想录算法训练营第4天 | lc24、lc19、lc面试题02.07、lc142

代码随想录算法训练营第4天 | lc24、lc19、lc面试题02.07、lc142

时间:2023-12-03 20:59:35浏览次数:48  
标签:面试题 slow ListNode lc24 nil 随想录 fast Next 指针

(本合集全部为Go语言实现)

相关文章链接:24题解 19题解 02.07题解 142题解
相关视频链接:

Leetcode24

状态:秒了
实现过程中的难点:对组内两个节点的指针指向流转需要倒腾明白。临时头结点真的很有用

个人写法

func swapPairs(head *ListNode) *ListNode {
  tmpHead := &ListNode{-1, head}
  ptr := tmpHead
  for ptr.Next != nil && ptr.Next.Next != nil {
    tmp := ptr.Next
    ptr.Next = tmp.Next
    tmp.Next = tmp.Next.Next
    ptr.Next.Next = tmp
    ptr = ptr.Next.Next
  }
  return tmpHead.Next
}

Leetcode19

状态:秒了
实现过程中的难点:需要自己模拟出最终状态,确保左指针是待删除节点的前一个节点

个人写法

func removeNthFromEnd(head *ListNode, n int) *ListNode {
  tmpHead := &ListNode{-1, head}
  post := tmpHead
  pre := tmpHead
  for i := 0; i < n; i++ {
    pre = pre.Next
  }
  for pre.Next != nil {
    pre = pre.Next
    post = post.Next
  }
  post.Next = post.Next.Next
  return tmpHead.Next
}

Leetcode面试题02.07

状态:改了几次,有些情况没考虑到位
实现过程中的难点:主要是巧妙写法的思路能不能想出来

个人写法

暴力写法应该是同步遍历两各分支,并同时将分支节点指针存到Set中,如果其中一个分支的指针在另一个分支的Set中出现了,那么该节点就是相交点

func getIntersectionNode(headA, headB *ListNode) *ListNode {
  if headA == nil || headB == nil {
    return nil
  } 
  ptr1, ptr2 := headA, headB
  for ptr1 != ptr2 {
    if ptr1 == nil {
      ptr1 = headB
    } else {
      ptr1 = ptr1.Next
    }
    if ptr2 == nil {
      ptr2 = headA
    } else {
      ptr2 = ptr2.Next
    }
  }
  return ptr1
}

Leetcode142

状态:记得这道是快慢指针,但是忘了过程是怎么写的了。看了代码随想录的B站视频复习了一下
实现过程中的难点:其实是数学问题,直接想不太好想,需要基于数学公式模拟过程

过程分析

快慢指针过程推导:两个指针初始状态都指向头节点,fast指针每次走两步,slow指针每次走一步

判断链表是否有环

  • 由于fast一定在前,所以如果fast先探测到空,那么链表一定无环
  • 如果链表有环,那么两指针一定会进入环,此时fast相对slow的速度为1,所以两者最终一定会相遇,而不会出现fast跳过slow的情景。这可能起初看到此题的一个疑问

环入口点的搜索

设无环部分长度为x,环内部分中,入口到相遇点长度为y,相遇点距离入口点长度为z

  • 由快慢指针之间的速度关系可以得到:2 * (x + y) = x + y + k * (y + z)
    • 推导得:x = (k - 1) * y + k * z
    • 为什么有个参数k?你可能会认为,从慢指针进入环到两者相遇,快指针可能是在走了k圏之后,才和慢指针相遇的,但是此时慢指针已经进入环了,首次相遇就会跳出循环,所以k = 1
    • 于是x = z,这就是结题的关键条件了

个人写法

func detectCycle(head *ListNode) *ListNode {
  if head == nil || head.Next == nil {
    return nil
  }
  fast, slow := head.Next.Next, head.Next
  for fast != slow {
    if fast == nil || fast.Next == nil {
      return nil
    }
    fast = fast.Next.Next
    slow = slow.Next
  }
  fast = head
  for fast != slow {
    fast = fast.Next
    slow = slow.Next
  }
  return fast
}

今日收获

  • 主要是最后一道题的思路没有想到,算是复习了一下

学习时长:2小时左右比较分散

标签:面试题,slow,ListNode,lc24,nil,随想录,fast,Next,指针
From: https://www.cnblogs.com/geJoyo/p/17873726.html

相关文章

  • 代码随想录算法训练营第3天 | leetcode203、leetcode707、leetcode206
    (本合集全部为Go语言实现)相关文章链接:203题解707题解206题解相关视频链接:Leetcode203状态:秒了实现过程中的难点:链表遍历一定要记得指针后移。另外,在头指针前加入一个新的临时头节点可以统一整个遍历过程,否则需要先确定初始时两指针的状态个人写法/***Definitionfo......
  • 代码随想录算法训练营第四天 | 24. 两两交换链表中的节点 19.删除链表的倒数第N个节
    LeetCode24.两两交换链表中的节点题目链接:LeetCode24思路:交换结点前将cur后第一个结点和第三个结点进行保存,然后修改cur指向头节点后再修改头节点后的结点classSolution{public:ListNode*swapPairs(ListNode*head){ListNode*dummyHead=newListNo......
  • 代码随想录算法训练营第三天 | 203.移除链表元素 707.设计链表 206.反转链表
    LeetCode 203.移除链表元素视频链接:LeetCode203思路:根据链表的性质,将目标值对应的节点保存在一个临时节点中,再重新设置cur下一个节点,再将临时节点进行删除classSolution{public:ListNode*removeElements(ListNode*head,intval){//删除头节点......
  • 代码随想录day4链表2
    day424.两两交换链表中的节点19.删除链表的倒数第N个节点面试题02.07.链表相交142.环形链表II总结资料来源:代码随想录(programmercarl.com)5.两两交换链表中的节点classSolution{private:/*data*/public:Solution(/*args*/);~Solution();......
  • 代码随想录day3链表1
    链表理论基础203.移除链表元素707.设计链表206.反转链表资料来源:代码随想录(programmercarl.com)1链表理论基础定义:是一种通过指针串联在一起的线性结构,每一个节点由两部分组成,一个是数据域一个是指针域(存放指向下一个节点的指针),最后一个节点的指针域指向null(空指针的意思)。......
  • JavaScript面试题
    列举常用的字符串方法indexOf(要查找的字符,开始索引)查找某个字符串第一次出现的位置lastIndexOf(要查找的字符,开始索引)查找某个子字符串最后一次出现的位置replace(被替换的内容,要替换的内容)替换好的字符串substr(从哪个索引开始,截取多少个)返回截取到的内容subst......
  • 数据库面试题从浅入深高频必刷「2024版」
    什么是数据库事务,它的ACID属性是什么?数据库事务是一组数据库操作的逻辑单元,要么全部执行成功,要么全部回滚。ACID属性是指原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability)。以下是对ACID属性的详细解释:原子性(Atomicity):原子性确保一个事务中的所有操......
  • 面试题总结
    1、通信协议通信协议通常使用分层架构来组织和管理通信过程。常见的分层架构包括以下几层:物理层:物理层负责处理物理媒介上的信号传输,如电缆、光缆、无线信号等。数据链路层:数据链路层负责将物理层传来的信号转换为数据帧,并在相邻节点之间进行数据传输。网络层:网络层负责......
  • 代码随想录day2
    977.有序数组的平方,209.长度最小的子数组,59.螺旋矩阵II,总结1有序数组的平方​ 给你一个按非递减顺序排序的整数数组nums,返回每个数字的平方组成的新数组,要求也按非递减顺序排序。2长度最小的子数组给定一个含有n个正整数的数组和一个正整数s,找出该数组中满......
  • 数据类型扩展及面试题详解day2
    publicclassdemo2{publicstaticvoidmain(String[]args){inta=10;inta1=010;//八进制inta2=0x10;//十六进制0~9A~f16System.out.println(a1);System.out.println(a);System.out.println(a2);fl......