求两个链表的第一个公共结点
2016-10-27 21:15
447 查看
代码:
//结点 struct ListNode { int m_val; ListNode* m_pNext; }; //第一种方法,需要两个辅助栈 ListNode* FirstCommonNode(ListNode* & pList1, ListNode* & pList2) { if (pList1 == nullptr || pList2 == nullptr) return nullptr; stack<ListNode*> sk1, sk2; ListNode* p1 = pList1; ListNode* p2 = pList2; while (p1 != nullptr) { sk1.push(p1); p1 = p1->m_pNext; } while (p2 != nullptr) { sk1.push(p2); p2 = p2->m_pNext; } ListNode* p_first_node = nullptr; while (!sk1.empty() && !sk2.empty()) { p1 = sk1.top(); p2 = sk2.top(); if (p1->m_val == p2->m_val) { sk1.pop(); sk2.pop(); p_first_node = p1; } } return p_first_node; } //第二种方法,分别遍历两个链表求出长度,再根据长度差让较长的先走若干步,即可 ListNode* FirstCommonNode2(ListNode* & pList1, ListNode* & pList2) { if (pList1 == nullptr || pList2 == nullptr) return nullptr; ListNode* pHead1 = pList1; ListNode* pHead2 = pList2; int length_list1 = 0; int length_list2 = 0; //先分别求出两个链表的长度 while (pHead1 != nullptr) { length_list1++; pHead1 = pHead1->m_pNext; } while (pHead2 != nullptr) { length_list2++; pHead2 = pHead2->m_pNext; } int length_diff = length_list1 > length_list2 ? length_list1 - length_list2 : length_list2 - length_list1; if (length_list1 > length_list2) { while (length_diff--) { pHead1 = pHead1->m_pNext; } } else { while (length_diff--) { pHead2 = pHead2->m_pNext; } } while ((pHead1 != nullptr) && (pHead2 != nullptr) &&(pHead1->m_val != pHead2->m_val)) { pHead1 = pHead1->m_pNext; pHead2 = pHead2->m_pNext; } return pHead1; }
相关文章推荐
- 两个链表的第一个公共结点
- 【剑指Offer学习】【面试题37:两个链表的第一个公共结点】
- 两个单向链表,找出它们的第一个公共结点。
- 找出两个链表的第一个公共结点
- 剑指Offer - 九度1505 - 两个链表的第一个公共结点
- 《剑指offer》刷题笔记(时间空间效率的平衡):两个链表的第一个公共结点
- 两个链表的第一个公共结点(java版)
- 两个链表的第一个公共结点
- 知识迁移能力-面试题37-两个链表的第一个公共结点
- Q37:两个链表的第一个公共结点
- 九度题目1505:两个链表的第一个公共结点
- 剑指offer——面试题37:两个链表的第一个公共结点(哈希,栈)
- 【剑指Offer-时间效率的平衡】输入两个链表,找出它们的第一个公共结点。
- 两个链表的第一个公共结点
- 两个链表的第一个公共结点
- 剑指Offer_面试题37_两个链表的第一个公共结点
- 两个链表的第一个公共结点
- (剑指offer)两个单向链表,找出它们的第一个公共结点
- 37 两个链表的第一个公共结点
- 《剑指offer》-两个链表的第一个公共结点