zoukankan      html  css  js  c++  java
  • 两个链表的第一个公共结点

    题目:输入两个链表,找出它们的第一个公共结点。

    链表结点定义如下:

    struct ListNode
    {
        int m_nKey;
        ListNode *m_pNext;
    };

    解决办法:首先遍历两个链表得到它们的长度,就能知道哪个链表比较长,以及长的链表比短的链表多几个结点。在第二次遍历的时候,在较长的链表上先走若干步,接着再同时在两个链表上遍历,找到的第一个相同的结点就是它们的第一个公共结点。

    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;
    }
    
  • 相关阅读:
    人月神话 读书笔记01
    团队项目个人每日总结(4.26)
    团队项目个人每日总结(4.25)
    团队项目个人每日总结(4.24)
    百度的用户体验
    团队项目个人每日总结(4.23)
    用户场景描述
    团队项目个人每日总结(4.22)
    团队项目个人每日总结(4.21)
    构建之法阅读笔记03
  • 原文地址:https://www.cnblogs.com/heyonggang/p/3592167.html
Copyright © 2011-2022 走看看