题目
得定两个单向链表,计算两个链表的第一个公共结点,若没有公共结点,返回空。
分析
代码如下:令两个链表的长度为m、n,不放认为m>=n,由于两个链表从第一个公共结点到链表的为节点是完全重合的。所以前面的(m-n)个结点一定没有公共结点。
先分别遍历两个链表得到他们的长度m,n。长链表空转|m-n|次,同步遍历两链表,知道找到相同结点或到链表结束。
时间复杂度为O(m+n)。
int CalcLength(SNode* p) { int nLen = 0; while (p) { p = p->pNext; nLen++ } return nLen; } SNode* FindFirstSameNode(SNode* pA, SNode* pB) { pA = pA->pNext; pB = pB->pNext; int nA = CalcLength(pA); int nB = CalcLength(pB); if (nA > nB) { SNode* pTmp = pA; pA = pB; pB = pTmp; int nTmp = nA; nA = nB; nB = nTmp; } for (int i = 0; i < nB - nA; i++) { pB = pB->pNext; } while (pA) { if (pA = pB) { return pA; } pA = pA->pNext; pB = pB->pNext; } return NULL; }
在单链表公共结点问题中,如果是链表存在环,则需要使用快慢指针的方式计算公共结点,两个指针每次移动一个/两个结点
通过这几次的算法学习之链表问题可以看出,纯链表的题目往往不难,但需要扎实的Coding基本功,在实现过程中要特别小心next的指向,此外,删除结点是一定要确保该结点不在需要。
小心引用类型的指针