剑指 Offer 52. 两个链表的第一个公共节点 - 力扣(LeetCode) (leetcode-cn.com)
目录
思路分析
设第一个链表有M个节点,第二个链表有N个节点。
方案1
看到这题,第一想法是倒着来,因为两个链表后面必定是重合的。但是链表是单链表,没法反向迭代,除非放到顺序容器里,比如放到两个数组里,或者两个栈里,然后反向迭代。
这样操作的话,时间复杂度是O(max(M, N)),空间复杂度是O(M + N)。
方案2
仔细一想,其实方案1是有多余的开销的:把两个链表放进数组的时候就已经把最后一段公共部分遍历了两遍了;然后从后向前排查两个数组,相当于又把公共部分遍历了两遍,这样算下来,公共部分其实算是遍历了四遍。
一个比较合理的想法是把两个链表所有的节点只遍历一遍,最后一段公共部分也只遍历一遍。
可以考虑遍历第一个链表的时候对每个节点做标记,这样遍历第二个链表的时候找到第一个有标记的节点就行了。做标记就是把节点指针和一个int/char/bool类型的变量关联