24. 两两交换链表中的节点
文档和视频讲解:代码随想录(programmercarl.com)
状态:ac
用时:1h
思路:加一个虚拟头节点让所有节点统一处理。具体的交换需要画图让思路更清晰。
代码:
注:操作在递归函数之后,节点交换是从后往前的。
19.删除链表的倒数第N个节点
文档和视频讲解:代码随想录(programmercarl.com)
状态:ac
用时:1h
思路:由于要找的是倒数第n个节点进行删除,是正数第个节点,可以定义快慢两个指针,快指针先走n次,则剩下,随后快慢指针一起以相同步进行动,当快指针走到链表最后,慢指针则走到了倒数第n个节点处。要注意走到要删除节点前一个节点就行了。
代码:
面试题02.07. 链表相交
文档和视频讲解:代码随想录(programmercarl.com)
状态:ac
用时:1h
思路:第一个常规思路就是,先遍历一遍两个链表,得到两个长度和其差值,让长的链表的指针先走长度差值的步进,接着两个指针一起行动,找到相同的指针。
第二个思路,是在题解大神看到的,即假设两个链表交点前长度是a,b,交点后是c。两个链表指针A,B一起行动,A遍历完后遍历,B同理。两个指针的步数分别为:
可见两个指针会同时到达交点。
代码:
注: 这里面还有一个问题就是,没有交点会不会导致无限循环。比如A走完后会从headB开始,走完后如果是null后又会回到headB。其实不然,无论如何两个指针的步数都会一样,当A走完headB,B也会走完headA,则A==B==null,就会跳出循环。
142.环形链表II
文档和视频讲解:代码随想录(programmercarl.com)
状态:未ac
用时:1.5h
思路:定义快慢两个指针,快指针走两步,慢指针走一步,假设环入口前长度为a,环长度为b。环前就像直线赛道跑步,同方向慢速的肯定跑不过快速并且不会相交,而指针进入环后会一直在环内循环,就像圈赛道赛跑,快速的经过一段时间会追上慢速的,即超过一圈(也有可能慢指针在进入入口前快指针已经走了很多圈)。快指针走了f步,慢指针走了s步,快指针比慢指针多走了n圈,则,,得。如果从head走到入口点,步数为,n可以是大于等于0的任何数。而慢指针已经走了nb步,只要再走a,就可以到入口点,因此,把快指针从head开始,两个指针一起走相同的步数,会在入口点相遇。
代码: