算法训练营第4天|链表第2部分

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

初想法:

把链表每两个分成一组,最后一组可以是 两个 也可以是 1个。

我想法是两个一组,但在写代码过程中,把每次循环还是分成四个一组了。导致出现错误。

看了代码随想录:

和我想的一样 都是要两个两个一组。

从dump开始 也我想的一样。就是实现中 可以画个图,再去实现。不要在实现时走偏!

总结:

这个题其实不难,但要找到循环题的条件 边界, 循环有几步。可以画个图 想一想!!

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

初想法:

暴力做法,先扫一遍 知道倒数第N个节点,是在哪(扫一遍得到总长度减N就知道了)。再扫一遍移除对应点。

但这个题 要争取一遍扫,就完成。那难点就在与怎么确定 第 N个节点在哪。有一个办法不知道属不属于扫一遍移除。

先reverse 然后 删除点后 再reverse了。想法不对 诶

看完代码随想录:

看完代码随想录 感觉这道题 好简单,fast > slow N就好了,这么简单,不知道自己为什么想不明白,诶。

双指针 快慢节点!多想 多思考! 不要脑子浆糊!看了答案感觉好简单,需要自己 慢慢的进步!有了双指针在脑海里 要灵活!!!!

做完后,感觉一定要多想,认真思考后 再做。这题想出来也就做出来了! 知道了 双指针 要会用!! 脑子不要糊!!

面试题 02.07. 链表相交

初想法:

做这个我先复习了 equals 和 ==的区别 以及相交 在我的理解是 比较 对应的地址是一个吗? 因为 ListNode是引用类型,所以==可以拿来用用来比较 地址。

首先各扫一遍,得到两个list的长短,然后将长的移动到和短的一样开始?

想法没问题 也做出来了。这个题挺简单了

看完代码随想录:

代码随想录 给了一个新的思路 挺不错的,合并两个list同时走。一个cur 走A + B,另一个走B+A

我来用例子详细讲解这个解法。

这个算法的核心思想是:让两个指针分别遍历 A+BB+A 两条链表,这样如果有相交点,它们一定会在相交点相遇。

例子1:有相交的情况

Copy链表A:  1 -> 2 -> 3 -> 4 -> 5
                      ↑
链表B:       7 -> 8 -↑

指针移动过程:
p1:1->2->3->4->5->null->7->8->4  (在4相遇)
p2:7->8->4->5->null->1->2->3->4  (在4相遇)

例子2:无相交的情况

Copy链表A:  1 -> 2 -> 3
链表B:  4 -> 5

指针移动过程:
p1:1->2->3->null->4->5->null  (最终指向null)
p2:4->5->null->1->2->3->null  (最终指向null)

为什么这样做是对的?

  1. 如果两个链表相交: 设链表A长度为 a+c(c是公共部分长度)设链表B长度为 b+cp1走完路程:a+c+bp2走完路程:b+c+a它们一定会在相交点相遇,因为走了相同的距离
  2. 如果两个链表不相交: p1走完路程:a+bp2走完路程:b+a它们最终都会指向null

代码随想录这个思路 非常好!!!给我拓展了!要会用这个思路!

142.环形链表II

初想法

这不就是图吗,图找个访问过的点 用found不就好了?但题里要求 空间要求O(1)这就比较麻烦了,建一个新的found 需要 O(n)的空间.

对要求只用空间O(1)绞尽脑汁想不出来

看完代码随想录:

这个题比较绕,是我第一次看视频讲解。很有意思。这个题就是用fast slow指针 fast速度是slow2倍,然后会找到相遇点,但这不是 环形点,需要 从head 和 相遇点 再重新 开始走,速度一样,这时候相遇的点才是环形点。很有意思的一个数学题其实。

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务