zoukankan      html  css  js  c++  java
  • 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;
        }
    };
  • 相关阅读:
    AJAX 基础知识
    jQuery知识点总结
    css基础应用总结
    javascript 总结
    找回密码-博客园
    centerOS 7 安装MySql
    java leetcode TreeNode类、ListNode类的实现
    iOS StatusBar状态栏文字颜色更改
    使用Jmeter压力测试工具测试
    安装node.js
  • 原文地址:https://www.cnblogs.com/z1141000271/p/12579771.html
Copyright © 2011-2022 走看看