【每日一道LeetCode】LeetCode160:相交链表

LeetCode160:相交链表解法

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

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

👍解题思路

创建两个指针p1和p2,分别指向两个A、B链表的头结点,p1和p2指针同时移动。当p1和p2走到链表末尾时,分别指向另外一个链表的头结点,即:p1.next=headB,p2.next=headA。如此操作可实现将A、B两个链表进行合并和同时移动。最后当p1和p2相等时,即可证明两链表相交,返回p1结点。

注意❗:交点不是数值相等,而是指针相等。

我们把上面的链表设为A链表,下面链表设为B链表。

当p1走到A链表末尾时,指向B链表的头结点headB。(p2走到B链表末尾时,指向A链表的头结点headA。)

当p1与p2相等时,即可证明两链表相交。

代码如下:

/**
     * 通过实现两个链表的同步移动来寻找相同节点
     * @param headA
     * @param headB
     * @return p1
     */
    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
        ListNode p1=headA;  //把A链表的头节点赋值给p1
        ListNode p2=headB;  //把B链表的头节点赋值给p2

        //使两个链表同步并且同步移动
        while (p1!=p2){
            if (p1==null){  //当p1指针到达末尾时
                p1=headB;   //指向B链表的头结点
            }else {
                p1=p1.next;
            }

            if (p2==null){  //当p2指针到达末尾时
                p2=headA;   //指向A链表的头结点
            }else {
                p2=p2.next;
            }
        }
        return p1;  //最后返回p1
    }

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值