面试题 02.03. 删除中间节点
可以删除链表至少为二的头节点,不能删除尾节点。
237. 删除链表中的节点
这与上题一摸一样。。
160. 相交链表
要求时间复杂度为 O(N),空间复杂度为 O(1)。如果不存在交点则返回 null。
设 A 的长度为 a + c,B 的长度为 b + c,其中 c 为尾部公共部分长度,可知 a + c + b = b + c + a。
当访问 A 链表的指针访问到链表尾部时,令它从链表 B 的头部开始访问链表 B;同样地,当访问 B 链表的指针访问到链表尾部时,令它从链表 A 的头部开始访问链表 A。这样就能控制访问 A 和 B 两个链表的指针能同时访问到交点。
如果不存在交点,那么 a + b = b + a,以下实现代码中 l1 和 l2 会同时为 null,从而退出循环。
21. 合并两个有序链表
思路很简单,创建一个新的节点,while循环遍历l1和l2并且比较大小,谁小添加谁。按照题意如果某一条链表先遍历完了,另一条没有遍历完成,那么剩下的直接添加就行。最后返回头节点head.next
也可以使用迭代。