Leetcode 160. 相交链表(双指针)

题目描述:

 

 题解:

解法1:仿照双指针求解环形链表的问题,将链表A或者链表B构造成一个环,然后求环形链表的入口。

解法2:

  •  创建两个指针 pApA 和 pBpB,分别初始化为链表 A 和 B 的头结点。然后让它们向后逐结点遍历。
  •  当 pApA 到达链表的尾部时,将它重定位到链表 B 的头结点 (你没看错,就是链表 B); 类似的,当 pBpB 到达链表的尾部时,将它重定位到链表 A 的头结点。
  •  若在某一时刻 pApA 和 pBpB 相遇,则 pApA/pBpB 为相交结点。
  •  想弄清楚为什么这样可行, 可以考虑以下两个链表: A={1,3,5,7,9,11} 和 B={2,4,9,11},相交于结点 9。 由于 B.length (=4) < A.length (=6),pBpB 比 pApA 少经过 22 个结点,会先到达尾部。将 pBpB 重定向到 A 的头结点,pApA 重定向到 B 的头结点后,pBpB 要比 pApA 多走 2 个结点。因此,它们会同时到达交点。 
  • 如果两个链表存在相交,它们末尾的结点必然相同。因此当 pApA/pBpB 到达链表结尾时,记录下链表 A/B 对应的元素。若最后元素不相同,则两个链表不相交。

AC代码:

  

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
        ListNode* pA = headA;
        ListNode* pB = headB;
        if(headA == NULL || headB == NULL) return NULL;
        int flag = 0;
        while(1)
        {
            if(pA == pB) return pA;
            pA = pA->next;
            pB = pB->next;
            if(pA == NULL)
            {
                flag ++;
                pA = headB;
            }
            if(pB == NULL)
            {
                flag ++;
                pB = headA;
            }
            if(flag >=3) break;
        }
        return NULL;
    }
};

 

posted @ 2020-03-27 10:39  猪突猛进!!!  阅读(210)  评论(0编辑  收藏  举报