以下内容是从网站中学习的~~~

给你两个单链表的头节点headA和headB,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回null。

图示两个链表在节点c1开始相交:

题目数据 保证 整个链式结构中不存在环。

注意,函数返回结果后,链表必须 保持其原始结构 。

示例1:

示例2:

示例3:

思路

简单来说,就是求两个链表交点节点的指针。

这里同学们要注意,交点不是数值相等,而是指针相等。

为了方便举例,假设节点元素数值相等,则节点指针相等。

看如下两个链表,目前curA指向链表A的头节点,curB指向链表B的头节点:

我们求出两个链表的长度,并求出两个链表长度的差值,然后让curA移动到,和curB 末尾对齐的位置,如图:

此时我们就可以比较curA和curB是否相同,如果不相同,同时向后移动curA和curB,如果遇到curA == curB,则找到交点。

否则循环退出返回空指针。

public class Solution {
    public ListNode getIntersectionNode(ListNode headA,ListNode headB){
        ListNode curA = headA;
        ListNode curB = headB;
        int lenA = 0;
        int lenB = 0;
        while(curA != null){  //求链表A的长度
            lenA++;
            curA = curA.next;
        }
        while(curB != null){  //求链表B的长度
            lenB++;
            curB = curB.next;
        }
        curA = headA;
        curB = headB;
        //让curA为最长链表的头,lenA为其长度
        if(lenB > lenA){
            // swap(lenA,lenB);
            int tempLen = lenA;
            lenA = lenB;
            lenB = tempLen;
            //swap(curA,curB);
            ListNode tempNode = curA;
            curA = curB;
            curB = tempNode;
        }
        //求长度差
        int gap = lenA - lenB;
        //让curA和curB在同一起点上(末尾位置对齐)
        while(gap-- > 0){
            curA = curA.next;
        }
        //遍历curA和curB,遇到相同则直接返回
        while(curA != null){
            if(curA == curB){
                return curA;
            }
            curA = curA.next;
            curB = curB.next;
        }
        return null;
    }
}

时间复杂度:O(n + m)

空间复杂度:O(1)

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐