难度:简单

    题目描述:
    编写一个程序,找到两个单链表相交的起始节点。
    image.png

    解题思路:
    两次遍历,先遍历一个链表,给链表中的每个节点都增加一个标志位,然后遍历另外一个链表,遍历到第一个已被标志过的节点为两链表相交的起始节点。

    1. var getIntersectionNode = function(headA, headB) {
    2. while(headA) {
    3. headA.flag = true
    4. headA = headA.next
    5. }
    6. while(headB) {
    7. if (headB.flag) return headB
    8. headB = headB.next
    9. }
    10. return null
    11. };

    双指针
    同步遍历 A、B 链表 pA 、 pB ,直到遍历完其中一个链表(短链表),如上图,设A为长链表
    那么此时 A、B 两遍表的长度差就为 pA 到链尾的长度,此时可以把 pB 指向长链表的表头 headA ,继续同步遍历,直到遍历完长链表
    此时,headA 到 pB 的长度就为两链表的长度差,pB 到链表的长度与 headB 到链尾的长度一致
    此时,可将 pA 指向 headB ,然后同步遍历 pB 及 pA ,直到有相交节点,返回相交节点,否则返回 null

    1. var getIntersectionNode = function(headA, headB) {
    2. // 清除高度差
    3. let pA = headA, pB = headB
    4. while(pA || pB) {
    5. if(pA === pB) return pA
    6. pA = pA === null ? headB : pA.next
    7. pB = pB === null ? headA : pB.next
    8. }
    9. return null
    10. };