剑指Offer_#52_两个链表的第一个公共节点
剑指Offer_#52_两个链表的第一个公共节点
Contents
题目
输入两个链表,找出它们的第一个公共节点。
如下面的两个链表:
在节点 c1 开始相交。
注意:
- 如果两个链表没有交点,返回 null.
- 在返回结果后,两个链表仍须保持原有的结构。
- 可假定整个链表结构中没有循环。
- 程序尽量满足 O(n) 时间复杂度,且仅用 O(1) 内存。
思路分析
这题的难点在于,相交的节点之前的节点数量不同,所以如果两个指针同时遍历,不会相遇,也就无从判断是否是相交节点。
一个很巧妙的方法是:
两个指针同时遍历两个链表,如果遍历结束,这个指针就去遍历另一个链表。这样一来,相当于两个指针在相交节点之前走过的路程是一样的,正好可以在相交节点相遇。
解答
public class Solution {
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
ListNode h1 = headA;
ListNode h2 = headB;
//如果没有交集,h1,h2最后同时指向null,跳出循环,返回null
while(h1 != h2){
if(h1 == null) h1 = headB;
else h1 = h1.next;
if(h2 == null) h2 = headA;
else h2 = h2.next;
}
return h1;
}
}
复杂度分析
时间复杂度O(n)
空间复杂度O(1)