LeetCode 160.相交链表

229 阅读1分钟

题目

[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;
    }
}