求链表的第一个公共节点

求链表的第一个公共节点主要思想

有如下两个链表:

有以下两种方法

  1. 上述链表,有一种蛮力方法,就是从一个链表中每一个节点,与另外链表中的节点,去比较,
    如果从中找到相同的节点,表示有公共节点,这个算法时间复杂度为O(n*m),两个链表的长度分别为n,m

  2. 如果使用快慢指针,让链表长的指针,先走,走的步数就为,两者长度差,如果两者有相同节点,必然会在一个地方,相遇,
    该算法的时间复杂度为O(max(n,m))

方法2 的实现代码为:

/*
struct ListNode {
	int val;
	struct ListNode *next;
	ListNode(int x) :
			val(x), next(NULL) {
	}
};*/
class Solution {
public:
    
    int lenOfList(ListNode* pHead){
        int len = 0;
        while( pHead != NULL){
            ++len;
            pHead = pHead->next;
        }
        return len;    
    }
    
    ListNode* FindFirstCommonNode( ListNode* pHead1, ListNode* pHead2) {
        if(pHead1 == NULL || pHead2 == NULL)
               return NULL;
        int len1,len2,k;
        ListNode *pFast=NULL,*pSlow=NULL;
        
        len1 = lenOfList(pHead1);
        len2 = lenOfList(pHead2);
        if(len1 >len2){
            pFast = pHead1;
            k = len1-len2;
            pSlow = pHead2;
        }else{
             pFast = pHead2;
             k = len2-len1;
             pSlow = pHead1;
        }
        int i=0;
        while(i<k){
            pFast = pFast->next;
            ++i;
        }
        
        while(pFast != NULL && pSlow != NULL){
            if(pFast == pSlow ){
                return pFast;
            }
            pFast = pFast->next;
            pSlow = pSlow->next;
            
        }
        return NULL;     
    }
};

posted on 2019-10-22 00:34  盛夏落木  阅读(239)  评论(0编辑  收藏  举报

导航