剑指offer(33)-两个链表的第一个公共结点
2016-06-17 17:30
405 查看
题目描述
输入两个链表,找出它们的第一个公共结点。代码
/* struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { } };*/ class Solution { public: 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->next; } while((pListHeadLong != NULL) && (pListHeadshort != NULL) && (pListHeadLong != pListHeadshort)) { pListHeadshort = pListHeadshort->next; pListHeadLong = pListHeadLong->next; } // 得到第一个公共节点 ListNode *pFirstCommonNode = pListHeadLong; return pFirstCommonNode; } // 获取链表的长度 unsigned int GetListLength(ListNode *pHead) { unsigned int nLength = 0; ListNode *pNode = pHead; while(pNode != NULL) { nLength ++; pNode = pNode->next; } return nLength; } };
相关文章推荐
- [C/C++]反转链表
- C#实现基于链表的内存记事本实例
- C#模拟链表数据结构的实例解析
- C语言实现带头结点的链表的创建、查找、插入、删除操作
- C++利用静态成员或类模板构建链表的方法讲解
- C++实现简单的学生管理系统
- Linux内核链表实现过程
- C++链表倒序实现方法
- C#通过链表实现队列的方法
- Node.js环境下JavaScript实现单链表与双链表结构
- C#实现的简单链表类实例
- 找出链表倒数第n个节点元素的二个方法
- Java数据结构之简单链表的定义与实现方法示例
- Java模拟有序链表数据结构的示例
- C语言单循环链表的表示与实现实例详解
- C++实现的链表类实例
- PHP小教程之实现链表
- PHP中模拟链表和链表的基本操作示例
- C语言双向链表的表示与实现实例详解
- js链表操作(实例讲解)