代码随想录算法训练营第四天 | 24. 两两交换链表中的节点,19.删除链表的倒数第N个节点,面试题 02.07. 链表相交,142.环形链表II

发布时间 2023-12-16 22:56:29作者: amulet

一、24. 两两交换链表中的节点

题目链接:

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

学习前:

思路:

未新增虚拟结点。节点数为0,1,2需要另外讨论。当节点数>=2时,返回的head值为第2个节点,需要3个指针first、second、prev,分别是第一个节点和第二个节点,以及第一个节点的前节点。while(first非空){if(second非空)...else 结束循环}

时间复杂度:O(n)

空间复杂度:O(1)

学习后:

  • 新增虚拟结点,不需要额外讨论某些节点数,均统一处理,使得逻辑清晰,代码可读性更高。核心思路是需要同时存储四个结点的信息,虚拟头结点第一个结点的前一个结点,还有第二个结点的后一结点

  • 可以进一步直接优化掉第四个结点,即第四个结点为second的next,优先赋值,从后往前

二、19.删除链表的倒数第N个节点

题目链接:

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

学习前:

思路:

两趟遍历。第一趟,确定链表的长度;第二趟,确定倒数第n个结点的前一结点,进行删除

时间复杂度:O(n)

空间复杂度:O(1)

学习后:

快慢指针,一趟遍历。虚拟结点的序号为0,初始快慢指针均指向虚拟结点,然后快指针先指向第n个结点,接着快慢指针一起移动,直到快指针指向最后一个节点,则慢指针指向要删除结点的前序结点。

三、面试题 02.07. 链表相交

题目链接:

LeetCode 面试题 02.07. 链表相交

学习前:

思路:

学习后:

首先获取两个链表的长度,在更长的链表上进行移动,两个指针的位置使得两个链表右对齐。

时间复杂度:O(n+m)

空间复杂度:O(1)

四、142.环形链表II

题目链接:

LeetCode 142.环形链表II

学习前:

思路:

学习后:

  1. 确定有无环。用快慢指针判断是否会相遇,快指针每次走2步,慢指针每次走1步,若相遇,则有环
  2. 在相遇时,确定相遇的节点位置
  3. 从第一个节点和相遇节点同时进行移动,每次都只走一步,当相遇时,就是入环的第一个结点

五、学习总结

  1. 时间:4h

  2. 快慢指针,yyds!!!

  3. 引入虚拟结点,可以使得操作具有统一性,不用额外判断head为空的情况