有环单链表相交判断练习题

题目

如何判断两个有环单链表是否相交?相交的话返回第一个相交的节点,不想交的话返回空。如果两个链表长度分别为N和M,请做到时间复杂度O(N+M),额外空间复杂度O(1)。
给定两个链表的头结点head1和head2,请返回一个bool值代表它们是否相交。

思路

一共有三种相交的情况:

  1. 在入环的节点相交
  2. 在入环的节点之前相交
  3. 在环中相交

解题的关键在于先拿到如环的节点,然后即可对三种情况进行判断

答案
ListNode* intersectNode(ListNode *head) {
    ListNode *slowNode = head;
    ListNode *fastNode = head;
    while (fastNode->next != NULL && fastNode->next->next != NULL) {
        fastNode = fastNode->next->next;
        slowNode = slowNode->next;
        if (slowNode == fastNode) {
            fastNode = head;
            while (fastNode != slowNode) {
                fastNode = fastNode->next;
                slowNode = slowNode->next;
            }
            return slowNode;
        }
    }
    return NULL;
}

bool chkInter(ListNode* head1, ListNode* head2, int adjust0, int adjust1) {
    ListNode *intersectNode1 = intersectNode(head1);
    ListNode *intersectNode2 = intersectNode(head2);
    // 第一种情况:在环的入口点或者环入口点之前就已经相交
    if (intersectNode1 == intersectNode2) {
        return true;
    }
    // 第二种情况:在环中相交
    ListNode *current = intersectNode1;
    while (1) {
        current = current->next;
        if (current == intersectNode1) {
            break;
        } else if (current == intersectNode2){
            return true;
        }
    }
    return false;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • //leetcode中还有花样链表题,这里几个例子,冰山一角 求单链表中结点的个数----时间复杂度O(n)这是最...
    暗黑破坏球嘿哈阅读 1,535评论 0 6
  • 1 序 2016年6月25日夜,帝都,天下着大雨,拖着行李箱和同学在校门口照了最后一张合照,搬离寝室打车去了提前租...
    RichardJieChen阅读 5,165评论 0 12
  • 链表问题是面试过程中经常被问到的一部分,很考查编程功底。最近刷了 LeetCode 上链表部分的面试题,我总结了一...
    JohnnyShieh阅读 4,984评论 0 9
  • 1. 链表 链表是最基本的数据结构,面试官也常常用链表来考察面试者的基本能力,而且链表相关的操作相对而言比较简单,...
    Mr希灵阅读 1,472评论 0 20
  • 如何判断两个有环单链表是否相交?相交的话返回true,不想交的话返回false。如果两个链表长度分别为N和M,请做...
    IT_Matters阅读 1,337评论 0 1