LeetCode 剑指offer Q52 两个链表的第一个公共节点

思路

这一题虽然是一个简单题,但是题目要求空间复杂度最好为o(1),这就断结了使用set的方法了。

浪漫双指针法:
假设有headA和headB两个链表,设置两个工作指针A,B,假设他们公共部分长度为c,headA长度为a+c,headB为b+c。那么我们怎样能够在不借助其他空间的情况下且时间复杂度尽量为o(n)。这就要求我们智能进行一次循环便利。我们要找的是位于c的那个公共节点C,那么咋样循环能同时让A和B同时到达C呢个。我们可以发现a+c+b=b+c+a,这个式子的意思就是当A扫描headA的末尾时我们让他继续对headB进行扫描b次就会到达C,同理我们让B扫描到末尾时再继续对headA进行扫描a次也会到达C,切AB两指针扫描的步数相同都是a+b+c。

代码

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) {
 *         val = x;
 *         next = null;
 *     }
 * }
 */
public class Solution {
    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
        if(headA==null||headB==null) return null;
        ListNode w1=headA,w2=headB;
        while(w1!=w2){
            w1=w1==null?headB:w1.next;
            w2=w2==null?headA:w2.next;

        }
        return w1;
        
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值