题目
[leetcode 160]leetcode-cn.com/problems/in…
思路——双指针
- 首先这道题是双指针,需要什么?两个速度一样的指针同时对两个链表遍历,来找到相同的节点。 但是两个链表长度不一致,有一个可能遍历都结束了,但是另外一个可能才遍历到一半。 这时候怎么办呢?就要把想办法让两个链表长度一致,使得遍历的步伐一致,以便于同时到达相遇点。
- 链表A: a+c, 链表B : b+c.。(c是公共部分)因为a+c+b = b+c+a,按照这个想法,两个指针其实总路程是一样的。又因为两个链表 步伐一致,看似链表长度不一致,但其实可以想象成两个人一直以同样的速度走在同一条路上,去同一个地方,终究会相遇的。
- 怎么实现这个想法呢?就要一个链表遍历完要去另一个链表头结点,不要停下来,一直走,直到相遇。按照公式,比如A,走完a+c,就去B的头结点,接着走,B也是同样的道理。只要两个指针不停下来,因为步伐一致,是不会错开的。
public class Solution {
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
if(headA == null||headB == null ){
return null;
}
ListNode pA = headA, pB = headB;
while(pA != pB){
pA = pA == null ? headB:pA.next;
pB = pB == null ? headA:pB.next;
}
return pA;
}
}