码迷,mamicode.com
首页 > 其他好文 > 详细

求链表的第一个公共节点

时间:2019-10-22 09:11:49      阅读:79      评论:0      收藏:0      [点我收藏+]

标签:两种方法   turn   指针   代码   方法   str   img   common   ast   

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

有如下两个链表:
技术图片

有以下两种方法

  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;     
    }
};

求链表的第一个公共节点

标签:两种方法   turn   指针   代码   方法   str   img   common   ast   

原文地址:https://www.cnblogs.com/wanshuafe/p/11717400.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!