《剑指offer》-两个链表的第一个公共结点

题目描述

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


解法:

一、暴力法,第一个链表从开头遍历,和第二个链表的每个节点元素比较,则需要两个for嵌套循环,那么复杂度是o(mn)

二、低复杂度法,最长的链表先行遍历,然后再同时遍历比较相等的节点。复杂度为o(n+m)

/*
struct ListNode {
	int val;
	struct ListNode *next;
	ListNode(int x) :
			val(x), next(NULL) {
	}
};*/
class Solution {
public:
    ListNode* FindFirstCommonNode( ListNode *pHead1, ListNode *pHead2) {
        unsigned int len1 = getListNode(pHead1);
        unsigned int len2 = getListNode(pHead2);
        int lenDiff = len1 - len2;; 
        ListNode* pHeadLong = pHead1;
        ListNode* pHeadShort = pHead2;  
        if(len1 < len2) {
            pHeadLong = pHead2;
            pHeadShort = pHead1;
            lenDiff = len2 - len1;
        }
       
        for(int i = 0; i < lenDiff; ++i){
            pHeadLong = pHeadLong->next;
        }
        while(pHeadLong && pHeadShort && pHeadLong != pHeadShort) {
            pHeadLong = pHeadLong->next;
            pHeadShort = pHeadShort->next;
        }
        ListNode* firstCom = pHeadLong;
        return firstCom;
    }
    unsigned int getListNode(ListNode* pHead) {
        ListNode* p = pHead;
        unsigned int len = 0;
        while(p) {
            ++len;
            p = p->next;
        }
        return len;
    }
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值