两个链表的第一个公共节点
题目
输入两个链表,找出它们的第一个公共结点。
思路
蛮力法:遍历第一个链表的结点,每到一个结点,就在第二个链表上遍历每个结点,判断是否相等。时间复杂度为O(m*n),效率低;
使用栈:由于公共结点出现在尾部,所以用两个栈分别放入两个链表中的结点,从尾结点开始出栈比较。时间复杂度O(m+n),空间复杂度O(m+n)。
利用长度关系:计算两个链表的长度之差,长链表先走相差的步数,之后长短链表同时遍历,找到的第一个相同的结点就是第一个公共结点。
利用两个指针:一个指针顺序遍历list1和list2,另一个指针顺序遍历list2和list1,(这样两指针能够保证最终同时走到尾结点),两个指针找到的第一个相同结点就是第一个公共结点。
测试用例
功能测试(有/无公共结点;公共结点分别在链表的中间,头结点和尾结点)
特殊测试(头结点为null)
java代码
1 | /** |
总结
1.由于有共同结点时,后面的链表是重合的,所以这道题关键是要保证最后同时遍历到达尾结点,因此就有了后面三种方法:
利用栈的先进后出实现同时到达;
利用长度关系,长链表先行几步,实现同时到达;
两个指针同时遍历两个链表,一个先list1后list2,另一个则相反,也可以实现同时到达。