寻找相交链表的公共节点

戏子无情 提交于 2019-12-02 06:22:07

声明:题目来源:力扣(LeetCode)

输入两个链表,找出它们的第一个公共结点。

题目链接:相交链表

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

示例1:
在这里插入图片描述
在节点 c1 开始相交。

示例2:
示例2
两链表不相交,返回NULL。

解题思路:

  1. 首先需要判断两个链表长度是否相等,使用两个指针分别以相等的速度遍历两个链表,判断哪个链表长,并计算出差值 d。
  2. 再使用两个指针同时从表头出发,指向长链表的指针先走 d 个节点,两者再同时走。
  3. 判断两指针值是否相等,若相等则返回该节点的地址。
  4. 遍历完依然不相等,返回NULL。

以下代码可供参考:

struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {
    if(headA == NULL || headB == NULL){
        return NULL;
    }
    struct ListNode *pA = headA;
    struct ListNode *pB = headB;
    while(pA->next && pB->next){
        pA = pA->next;
        pB = pB->next;
    }
    int IsALonger;
    if(pA->next){
        IsALonger = 1;
    }
    else{
        IsALonger = 0;
    }
    struct ListNode *rear = IsALonger ? pA : pB;
    int advance = 0;
    for( ; rear->next; ++advance){
        rear = rear->next;
    }
    pA = headA;
    pB = headB;
    for(int i = 0;i < advance;++i){
        if(IsALonger){
            pA = pA->next;
        }
        else{
            pB = pB->next;
        }
    }
    while(pA && pB){
        if(pA == pB){
            break;
        }
        pA = pA->next;
        pB = pB->next;
    }
    return pA;
}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!