题解 | NO.10#两个链表的第一个公共结点#2.29

两个链表的第一个公共结点

https://www.nowcoder.com/practice/6ab1d9a29e88450685099d45c9e31e46

/**
 * struct ListNode {
 *  int val;
 *  struct ListNode *next;
 * };
 */

/**
 *
 * @param pHead1 ListNode类
 * @param pHead2 ListNode类
 * @return ListNode类
 */
struct ListNode* FindFirstCommonNode(struct ListNode* pHead1,
                                     struct ListNode* pHead2 ) {
    int i = 1, j = 1, k = 0;   //i,j分别记录两个链表的长度
    struct ListNode* p = pHead1, *q = pHead2;   //用p,q分别遍历两个链表
    while (p != NULL) {
        ++i;
        p = p->next;
    }
    while (q != NULL) {
        ++j;
        q = q->next;
    }
    p = pHead1;   //将p,q分别重新指向两个链表的头结点
    q = pHead2;
    if (i <= j) {   //链表1长度小于等于链表2
        k = j - i;
        for (int s = 1; s <= k; ++s) {   //调整q的位置,使p与q所指结点后的链表长度相等
            q = q->next;
        }
    } else {    //链表2长度小于等于链表1
        k = i - j;
        for(int s = 1; s <=k; ++s){    //调整p的位置,使p与q所指结点后的链表长度相等
            p = p->next;
        }
    }
    while (p != q && p != NULL) {    //找到链表第一个公共结点停止,或者链表没有公共结点
        p = p->next;
        q = q->next;
    }
    return p;   //返回第一个公共结点,或者返回空链表
}

全部评论

相关推荐

05-19 09:12
河南大学 Java
程序员小白条:怎么还用网上的经典项目,速成是很少有人去捞面试的
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务