第六十二题(求两个单向链表的第一个公共节点)

来源:互联网 发布:淘宝几个好评是几分 编辑:程序博客网 时间:2024/06/05 17:51
62.找出链表的第一个公共结点。
题目:两个单向链表,找出它们的第一个公共结点。
链表的结点定义为:
struct ListNode
{
int m_nKey;
ListNode* m_pNext;

};

分析:

这道题最直观的解法就是顺遍历其中的一个链表,对于其中的每一个链表节点,通过遍历第二个链表的节点来判断两个节点是否相同,第一次得到相同的结果时就是找到了他们的第一个公共节点,该算法的复杂度为o(mn)。

还有另外一种线性复杂度的方法,考虑若这两个单向链表长度相同,那么他们从头结点同时开始遍历并比较节点,首次相同的节点就是他们的第一个公共节点,那么对于长度不相同的两个链表,怎么处理?对了,我们可以先让长度较长的链表先移动一定的步数后再让较短的开始移动,移动的步数其实就是两个链表的长度差,这样子就可以了。

这里给出第二种方法的代码:

ListNode* firstCommonNode(ListNode *head1, ListNode *head2){int len1=0, len2=0;ListNode *p1, *p2;if (head1 == NULL || head2 == NULL)return NULL;p1 = head1;p2 = head2;while (p1 != NULL){p1 = p1->m_pNext;len1++;}while (p2 != NULL){p2 = p2->m_pNext;len2++;}p1 = head1;p2 = head2;while (len1 > len2){p1 = p1->m_pNext;len1--;}while (len1 < len2){p2 = p2->m_pNext;len2--;}while (p1 != p2){p1 = p1->m_pNext;p2 = p2->m_pNext;}return p1;}



0 0
原创粉丝点击