两个链表的第一个公共结点
2015-10-07 16:53
211 查看
题目:输入两个链表,找出他们的第一个公共结点。
方法1:分别把两个链表的节点放入两个栈里,这样两个链表的尾结点就位于两个栈的栈顶,接下来比较两个栈顶的结点是否相同。如果相同,则把栈顶弹出接着比较下一个栈顶,直到找到最后一个相同的结点。时间和空间复杂度都是O(m+n)。
方法2:先遍历两个链表得到它们的长度,因此直到哪个链表比较长,以及长链表比短链表多几个结点。在第二次遍历的时候,在较长的链表上先走若干步,接着再同时在两个链表上遍历,找到的第一个相同的结点就是它们的第一个公共结点。
测试用例:
功能测试(输入的两个链表有公共交点:第一个公共结点在链表的中间,第一个公共结点在链表的末尾,第一个公共结点是链表的头结点;输入的两个链表没有公共结点)。
特殊输入测试(输入的链表头结点是NULL指针)
相关题目:如何求两个结点的最低公共祖先。
方法1:分别把两个链表的节点放入两个栈里,这样两个链表的尾结点就位于两个栈的栈顶,接下来比较两个栈顶的结点是否相同。如果相同,则把栈顶弹出接着比较下一个栈顶,直到找到最后一个相同的结点。时间和空间复杂度都是O(m+n)。
方法2:先遍历两个链表得到它们的长度,因此直到哪个链表比较长,以及长链表比短链表多几个结点。在第二次遍历的时候,在较长的链表上先走若干步,接着再同时在两个链表上遍历,找到的第一个相同的结点就是它们的第一个公共结点。
ListNode* FindFirstCommonNode(ListNode *pHead1, ListNode* pHead2){ //得到两个链表的长度 unsigned int nLength1 = GetListLength(pHead1); unsigned int nLength2 = GetListLength(pHead2); int nLengthDif = nLength1 - nLength2; ListNode* pListHeadLong = pHead1; ListNode* pListHeadShort = pHead2; if (nLength2 > nLength1){ pListHeadLong = pHead2; pListHeadShort = pHead1; nLengthDif = nLength2 - nLength1; } //先在长链表上走几步,再同时在两个链表上遍历 for (int i = 0; i < nLengthDif; ++i){ pListHeadLong = pListHeadLong->m_pNext; } while ((pListHeadLong != NULL) && (pListHeadShort != NULL) && (pListHeadLong != pListHeadShort)){ pListHeadLong = pListHeadLong->m_pNext; pListHeadShort = pListHeadShort->m_pNext; } //得到第一个公共结点 ListNode* pFirstCommonNode = pListHeadLong; return pFirstCommonNode; } unsigned int GetListLength(ListNode* pHead){ unsigned int nLength = 0; ListNode* pNode = pHead; while (pNode != NULL){ ++nLength; pNode = pNode->m_pNext; } return nLength; }
测试用例:
功能测试(输入的两个链表有公共交点:第一个公共结点在链表的中间,第一个公共结点在链表的末尾,第一个公共结点是链表的头结点;输入的两个链表没有公共结点)。
特殊输入测试(输入的链表头结点是NULL指针)
相关题目:如何求两个结点的最低公共祖先。
相关文章推荐
- [C/C++]反转链表
- C#实现基于链表的内存记事本实例
- C语言实现带头结点的链表的创建、查找、插入、删除操作
- C++实现简单的学生管理系统
- Linux内核链表实现过程
- C++链表倒序实现方法
- C#通过链表实现队列的方法
- C#实现的简单链表类实例
- 找出链表倒数第n个节点元素的二个方法
- Java数据结构之简单链表的定义与实现方法示例
- C语言单循环链表的表示与实现实例详解
- C++实现的链表类实例
- PHP小教程之实现链表
- C语言双向链表的表示与实现实例详解
- C语言实现输出链表中倒数第k个节点
- C++语言实现线性表之链表实例
- STL list链表的用法详细解析
- C语言创建链表错误之通过指针参数申请动态内存实例分析
- php链表用法实例分析
- JavaScript中数据结构与算法(三):链表