两个单链表的第一个公共节点

本文介绍了一种高效算法来确定两个单链表的第一个公共节点。通过先计算两个链表的长度并找到长度差,让较长链表先移动差值步数,之后同步遍历两个链表直至找到首个相同节点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:求两个单链表的第一个公共子节点。

思路:我们可以先遍历两个单链表得到长度,然后求得两个链表长度的差值,然后让长的那个链表先走到差值长度位置,然后两个链表再同时遍历,直到找到第一个公共节点。

struct ListNode {
    int value;
    ListNode *next;
};

int getListLength(ListNode  *head){
    if(head == NULL)
        return 0;
    ListNode *p = head;
    int len = 0;
    while(p != NULL){
        len++;
        p = p->next;'
    }
    return len;
}

ListNode *FindFirstCommonNode(ListNode *head1,ListNode *head2){
    int len1 = getListLength(head1);
    int len2 = getListLength(head2);
    int diff = len1 - len2;
    ListNode *longList = head1;
    ListNode *shortList = head2;
    if(len2 > len1){
        longList = head2;
        shortList = head1;
        diff = len2 - len1;
    }
    for(int i = 0;i < diff;i++){
        longList = longList->next;
     } 
     while(longList && shortList && longList != shortList){
        longList = longList->next;
        shortList = shortList->next;
    }
    ListNode *firstcommonnode = NULL;
    if(longList == shortList)
        firstcommonnode = longList;
    return firstcommonnode;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值