无环单链表判相交练习题

现在有两个无环单链表,若两个链表的长度分别为m和n,请设计一个时间复杂度为O(n + m),额外空间复杂度为O(1)的算法,判断这两个链表是否相交。
给定两个链表的头结点headAheadB,请返回一个bool值,代表这两个链表是否相交。保证两个链表长度小于等于500。

思路:

先得出两个链表的长度m和n, 比较m和n的大小,将长度较大的链表的头结点向前移动|m-n|个位置,然后将headA和headB一起移动.
为什么要移动|m-n|个位置? 是因为如果两链表相交,意味着他们从某一点之后就重合了,那么非重合部分的长度的差就是|m-n|,让稍长的链表先移动|m-n|步,他们就可以在重合的入口处相遇.

图片来自牛客网
import java.util.*;

/*
public class ListNode {
    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }
}*/
public class CheckIntersect {
    public boolean chkIntersect(ListNode headA, ListNode headB) {
        // write code here
        int lenA=getListLen(headA);
        int lenB=getListLen(headB);
        if(lenA==0||lenB==0)return false;
            
        if(lenA<lenB){
            headB=runKNode(headB,lenB-lenA);
        }
        else{
            headA=runKNode(headA,lenA-lenB);
        }
        while(headA!=null&&headA!=headB){
            headA=headA.next;
            headB=headB.next;
        }
        return headA==null?false:true;
        
    }
    private int getListLen(ListNode head){
        int len=0;
        while(head!=null){
            len++;
            head=head.next;
        }
        return len;
    }
    
    private ListNode runKNode(ListNode head,int len){
        for(int i=0;i<len;i++){
            head=head.next;
        }
        return head;
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • B树的定义 一棵m阶的B树满足下列条件: 树中每个结点至多有m个孩子。 除根结点和叶子结点外,其它每个结点至少有m...
    文档随手记阅读 13,693评论 0 25
  • 转载请注明出处:http://www.jianshu.com/p/c65d9d753c31 在上一篇博客《数据结构...
    Alent阅读 3,606评论 4 74
  • 大学的时候不好好学习,老师在讲台上讲课,自己在以为老师看不到的座位看小说,现在用到了老师讲的知识,只能自己看书查资...
    和珏猫阅读 1,554评论 1 3
  • 今天家访的学生是我班的刘泽奇,一个文质彬彬的男孩儿,今天到家访之后知道了孩子的成长环境是比较和谐,妈妈说起孩子比较...
    yanliuxin2006阅读 291评论 0 1
  • 我的旅行哲学 我不是很赞同按照别人的出行路线来旅游,因为每个地方都有独特的人文自然,能不能get到这些地方的精髓,...
    威尼斯假面阅读 479评论 3 6

友情链接更多精彩内容