160. 相交链表

编写一个程序,找到两个单链表相交的起始节点。
注意:

如果两个链表没有交点,返回 null.
在返回结果后,两个链表仍须保持原有的结构。
可假定整个链表结构中没有循环。
程序尽量满足 O(n) 时间复杂度,且仅用 O(1) 内存。

/**
 * 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 *cur1=headA, *cur2=headB;
        while (cur1!=cur2){
            cur1= cur1?cur1->next:headB;
            /*不相等且不为空指向下一个;不相等为空指向b头指针*/
            cur2= cur2?cur2->next:headA;
           /*不相等且不为空指向下一个;不相等为空指向a头指针*/
        }
        return cur1;
/*这个思路就是 ListA + ListB = A + intersection + Bb + intersection
             ListB + ListA = Bb + intersection + A + intersection
  用大A表示ListA里面非共有 Bb表示listB里面非共有的,可以看到在第二个intersection的开头两个链表长度是一样的,必然相等
  所以我们可以遍历A再遍历B,另一个遍历B再遍历A,两个指针必定在第二个交集处相遇,没有交集就是空指针
*/

    }
};
class Solution {
public:
    ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
        ListNode *cur1=headA, *cur2=headB;
        if (cur1==NULL || cur1==NULL) return NULL;
        while (cur1!=cur2){
            if (cur1==NULL) cur1=headB;
            else cur1=cur1->next;
            if (cur2==NULL) cur2=headA;
            else cur2=cur2->next;
        }
        return cur1;
/* a-b和b-a遍历到最后->next都指向尾部指针null,返回null
    }
};
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 链表 @[链表|双指针] 链表问题相对容易掌握。 不要忘记"双指针解法",它不仅适用于数组问题,而且还适用于链表问...
    万浩2020阅读 390评论 0 1
  • 搞懂单链表常见面试题 Hello 继上次的 搞懂基本排序算法,这个一星期,我总结了,我所学习和思考的单链表基础知识...
    醒着的码者阅读 4,767评论 1 45
  • 1.判断该产品当前处于生命周期发展的哪一个阶段?现阶段要面临的核心问题是什么?以及其核心突破口可能在哪里?并说明原...
    不惊不扰阅读 1,267评论 0 5
  • 马上进入七月份了,七月份其实是我的一个转折点,去年的七月底开始进入嘿牛,从我的一无所知到现在的可以自己单独的联调设...
    pphu阅读 119评论 0 0
  • 阳光在白云里扬帆远行 我在随波逐流中孤愁 你那厢卸妆换衫拥香入眠 我在梦魇里哭到耄耋之年
    石少雨阅读 114评论 0 0

友情链接更多精彩内容