24. 两两交换链表中的节点
关于这一题,我感觉其中的要点依然是创建一个虚拟头节点,然后可以统一操作。基础部分就是简单的链表节点交换。
19.删除链表的倒数第N个节点
这个一开始自己写,很迷茫,按照一般的常规写,会在这种情况
和
这两种情况下陷入对于边界情况的处理的困境。
然而发现,在使用快慢指针结合虚拟头节点的方式会事半功倍。这才是这个题的关键。
面试题 02.07. 链表相交
这个的核心是“尾端对齐”。即,把最长的链表的当前指针指向从一个节点,这个节点的位置条件是:两个链表分别同步从后向前数,短链表到head的时候,当前指针所在的位置。这样就把一般手段里的笨拙的双层遍历变成了单次遍历,也就是从O(n^2)到O(n)
142.环形链表II
这个环形链表的核心有两个。
一个是能想到我们日常跑步被人套一圈的经历:如果有一个人速度快一些,另一个人速度慢一些,那么如果操场是一个环形,那么就一定会相遇。这里其实蕴含了两个要点,一个是操场的环形,另一个是跑步的两个人的过程是连续的,这个条件对应到我们数字的维度,我认为就是跑的快的比跑的慢的仅快一个单位,这样才有数字维度的连续性。
第二个核心点是通过数学推导,可以发现
这样就可以方便简洁的写出解决方法。