Day4 24两两交换 19 删除倒数n 02.07链表相交 142环形链表

作业条:

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

题目链接:
https://leetcode.cn/problems/swap-nodes-in-pairs/

文章讲解
https://programmercarl.com/0024.%E4%B8%A4%E4%B8%A4%E4%BA%A4%E6%8D%A2%E9%93%BE%E8%A1%A8%E4%B8%AD%E7%9A%84%E8%8A%82%E7%82%B9.html#%E6%80%9D%E8%B7%AF

视频讲解
https://www.bilibili.com/video/BV1YT411g7br/

第一想法

直接对两个相邻链表指针进行反转,但是到反转下两个的时候发现不太对,因为第一个没办法指向第三个

看完解答后的想法

思路要用第一个操作后面两个节点,而不仅仅是对两个节点的操作

  1. 什么时候需要考虑加dump head?
  2. 判断循环终止的条件到底是cur不为空还是cur->next不为空:当链表为奇数的时候是cur->next->next为空结束,当链表为偶数是cur->next为空结束
  3. 下一次循环只需要把cur赋值为cur->next->next就可以,不用管是不是交换过了值

实现过程中的问题

主要注意循环条件

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

题目链接:
https://leetcode.cn/problems/remove-nth-node-from-end-of-list/
文章讲解
https://programmercarl.com/0019.%E5%88%A0%E9%99%A4%E9%93%BE%E8%A1%A8%E7%9A%84%E5%80%92%E6%95%B0%E7%AC%ACN%E4%B8%AA%E8%8A%82%E7%82%B9.html#%E6%80%9D%E8%B7%AF
视频讲解
https://www.bilibili.com/video/BV1vW4y1U7Gf/?spm_id_from=333.788

第一想法:

只是有印象要用快慢指针,但是具体怎么用忘记了。还以为是直接一个指针走到size-n的位置,但是链表没有具体的size,所以需要遍历两遍;
但是快慢指针,快指针先走,慢指针再走,其实也是遍历两遍;

看完解答后的想法:

看完解答之后发现只需要让快指针多走就可以了。

  1. 怎么确定快指针要走快多少步
  2. 循环终止条件
  3. 需不需要dumphead: 需要
    快指针比慢指针走快n+1步,并且快指针不为空;
    快指针比慢指针走快n步,并且快指针->next不为空;
    这两个判断条件一样吗?一样的,两种写法都可以。

实现过程中的问题:

面试题 02.07. 链表相交

题目链接:
https://leetcode.cn/problems/intersection-of-two-linked-lists-lcci/

文章讲解
https://programmercarl.com/%E9%9D%A2%E8%AF%95%E9%A2%9802.07.%E9%93%BE%E8%A1%A8%E7%9B%B8%E4%BA%A4.html#%E6%80%9D%E8%B7%AF

视频讲解

第一想法

用两个指针分别指向两个链表,当遍历完自己之后去遍历对方,最终两个指针如果相等就是相交的节点。

看完解答后的想法

想法一致

实现过程中的问题

循环结束条件:当两个链表相交的时候,结束条件为指针相同;当两个链表不相交的时候,最终两个指针的值也会相同并且为null

今日收获和学习时长

3h