思路
这一题虽然是一个简单题,但是题目要求空间复杂度最好为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;
}
}