链表--链表相交 leetcode面试题 02.07

题目

给定两个链表,判断两个链表是否相交,如果相交返回相交的交点,否则返回空结点。


两个链表相交

思路

  1. 暴破法
    采用双循环,从第一个链表第一个开始依次寻找第二个链表中的结点是否相同,这样下来时间复杂度为O(n*n),空间复杂度为O(1)

  2. 哈希法
    将第一个结点存入哈希表中,然后遍历第二个链表的结点判断是否有相同的结点

  3. 双指针法
    以上图为例,给定两个指针first和second,分别指向两个链表的头结点,每个指针先将自己的链表遍历一遍,然后遍历另一个链表,如果在这个过程中两个链表相等,则代表有交点,相等的那个结点即为交点。
    解析:
    first指针先遍历第一个链表,走了AD+DC的长度,然后first指针遍历第二个结点,当first指针指向D结点时,first指针走的长度时AD+DC+BD
    seconde指针首先遍历第二个链表,走了BD+DC的长度,然后second指针遍历第二个结点,当second指针指向D结点时,second指针走的长度是BD+DC+AD
    这两个指针走到D结点时走的长度是一样的,所以如果两个指针相同,必然是有交点。
    时间复杂度O(n)
    空间复杂度O(1)

c++代码

循环可以直接返回的原因是,当两个链表没有交点时,那两个指针一定都走到了链表末尾,都指向了空结点,可以直接返回。

ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
        ListNode *first = headA, *second = headB, *temp;
       
        while(first != second){
            if(first == NULL) first = headB;
            else   first = first->next;
            if(second == NULL) second = headA;
            else second = second->next;
        }

        return first;
    }

你可能感兴趣的:(链表--链表相交 leetcode面试题 02.07)