链表面试题~合并两个有序的单链表

题目:输入两个链表,找出它们的第一个公共结点。
首先我们看到这个题,首先会想到的的方法是蛮力法,也就是逐个遍历链表1中的节点,再与链表2中的每一个节点进行逐一比较,显然这种办法并不是一个好办法。
这里写图片描述
两个链表都是有序的,我们可以通过遍历两个链表,分别求出两个链表的长度以及他们的长度之差,第二部遍历的时候,先让长的链表走两个链表之差步,然后两个链表同时走,走到两个链表的交点时,两个链表就会指向同一个数据。
下面用代码实现相关操作

struct ListNode {
    int val;
    struct ListNode *next;
    ListNode(int x) :
        val(x), next(NULL) {
    }
};

ListNode* FindFirstCommonNode(ListNode *pHead1, ListNode *pHead2) {
    int len1 = 0, len2 = 0;
    int sublen = 0;
    ListNode* temp1 = pHead1;
    ListNode* temp2 = pHead2;

    if (pHead1 == NULL || pHead2 == NULL)
        return NULL;

    //求两个链表的长度 
    while (temp1)
    {
        len1++;
        temp1 = temp1->next;
    }

    while (temp2)
    {
        len2++;
        temp2 = temp2->next;
    }

    temp1 = pHead1;
    temp2 = pHead2;
    // 判断两个链表哪个比较长 
    if (len1 > len2)
    {
        sublen = len1 - len2;
        while (sublen--)
        {
            temp1 = temp1->next;
        }
    }
    else if (len2 > len1)
    {
        sublen = len2 - len1;
        while (sublen--)
        {
            temp2 = temp2->next;
        }
    }

    // 找公共节点 
    while (temp1 != NULL)
    {
        if (temp1 == temp2)
            break;
        temp1 = temp1->next;
        temp2 = temp2->next;
    }

    return temp1;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值