求链表的第一个公共节点
求链表的第一个公共节点主要思想
有如下两个链表:
有以下两种方法
-
上述链表,有一种蛮力方法,就是从一个链表中每一个节点,与另外链表中的节点,去比较,
如果从中找到相同的节点,表示有公共节点,这个算法时间复杂度为O(n*m),两个链表的长度分别为n,m -
如果使用快慢指针,让链表长的指针,先走,走的步数就为,两者长度差,如果两者有相同节点,必然会在一个地方,相遇,
该算法的时间复杂度为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;
}
};
作者: 盛夏落木
出处: https://www.cnblogs.com/wanshuafe/
关于作者:专注云存储,文件系统领域,请多多赐教!
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出, 原文链接 如有问题, 可邮件(wanshuafe@163.com)咨询.