数据结构与算法整理

链表-查找两个链表的公共节点

2020-03-05  本文已影响0人  茶还是咖啡

两个链表相交,查找两个链表的公共节点

eg:
两个链表分别是:
L1: 1->1->2->3->5->4->5
L2: 1->2->3->4->5
公共节点为4


链表L1的长度为7,链表L2的长度为5,L1先走7-5=2个节点后,两个链表同步移动,那么第一个相同地址的节点即为相交节点。

code

int findFirstCommonNode(ElemSN *h1,ElemSN *h2){
    if(h1==NULL||h2==NULL){
        return -1;
    }
    int l1 = 0,l2 = 0;
    while(h1!=NULL||h2!=NULL){
        if(h1!=NULL){
            l1++;
            h1 = h1->next;
        }
        if(h2!=NULL){
            l2++;
            h2 = h2->next;
        }
    }
    int n = l1-l2;
    while (n!=0) {
        if(n>0){
            n--;
            h1=h1->next;
        }else{
            n++;
            h2=h2->next;
        }
    }
    // 此时两个链表的长度一致,所以合法性只需要判断任意一个就可以
    // 如果两个链表的节点地址想同,说明该节点即为第一个公共节点
    while (h1!=NULL&&h1!=h2) {
        h1 = h1->next;
        h2 = h2->next;
    }
    // 说明两个链表没有公共节点
    if(h1==NULL){
        return -1;
    }
    return h1->data;
}

上一篇 下一篇

猜你喜欢

热点阅读