剑指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)

posted @ 2020-07-19 17:51  Howfar's  阅读(152)  评论(0编辑  收藏  举报