剑指offer 37---求两个链表的第一个公共结点
2017-07-22 21:45
405 查看
求两个链表的第一个公共结点
思路:(假设链表不带环)
此处求解的是两个单链表,如果两个单向链表有公共的结点,那么这两个链表从某一结点开始,它们的_next都指向同一结点。由于是单链表的结点,每个结点只有一个_next,因此从第一个公共结点开始,之后它们所有的结点都是重合的,不可能再出现分叉。所以两个有公共结点而部分重合的链表,拓扑形状像一个Y,而不可能是X
思路:(假设链表不带环)
此处求解的是两个单链表,如果两个单向链表有公共的结点,那么这两个链表从某一结点开始,它们的_next都指向同一结点。由于是单链表的结点,每个结点只有一个_next,因此从第一个公共结点开始,之后它们所有的结点都是重合的,不可能再出现分叉。所以两个有公共结点而部分重合的链表,拓扑形状像一个Y,而不可能是X
struct ListNode { int _value; ListNode* _next; ListNode(const int& value) :_value(value) , _next(NULL) {} }; //求两个链表的第一个公共结点 ListNode* FirstCommonNode(ListNode* pHead1, ListNode* pHead2) { if (pHead1 == NULL || pHead2 == NULL) { return NULL; } ListNode* longList = pHead1; ListNode* shortList = pHead2; ListNode* cur1 = pHead1; ListNode* cur2 = pHead2; int len1 = 0; int len2 = 0; while (cur1) { cur1 = cur1->_next; len1++; } while (cur2) { cur2 = cur2->_next; len2++; } int k = 0; if (len1 > len2) { k = len1 - len2; } else { k = len2 - len1; longList = pHead2; shortList = pHead1; } while (k--) { longList = longList->_next; } while ((longList != NULL) && (shortList != NULL)) { if (longList == shortList) { return shortList; } else { longList = longList->_next; shortList = shortList->_next; } } return NULL; }
相关文章推荐
- 【剑指offer】面试题37:两个链表的第一个公共结点
- 剑指offer 面试题37 两个链表的第一个公共结点
- 【剑指Offer】面试题37:两个链表的第一个公共结点
- 【剑指Offer学习】【面试题37:两个链表的第一个公共结点】
- 【剑指offer】面试题37:两个链表的第一个公共结点
- 剑指offer--面试题37:两个链表的第一个公共结点
- 剑指offer 37题 【时间空间效率的平衡】两个链表的第一个公共结点
- 剑指offer——面试题37:两个链表的第一个公共结点
- 剑指offer——面试题37:两个链表的第一个公共结点
- 剑指offer-面试题37-两个链表的第一个公共结点
- 【剑指offer】5.3时间效率与空间效率的平衡——面试题37:两个链表的第一个公共结点
- 【剑指Offer学习】【面试题37:两个链表的第一个公共结点】
- 【剑指offer】面试题37:两个链表的第一个公共结点
- 剑指Offer----面试题37:两个链表的第一个公共结点
- 剑指offer-面试题37-两个链表的第一个公共结点
- 剑指offer 面试题37 两个链表的第一个公共结点
- 剑指Offer面试题37(Java版):两个链表的第一个公共结点
- 【剑指offer-解题系列(37)】 两个链表的第一个公共结点。
- 剑指offer-37 两个链表的第一个公共结点
- 剑指Offer:两个链表的第一个公共结点Java