• 编程算法


    两个链表的第一个公共结点 代码(C)


    本文地址: http://blog.csdn.net/caroline_wendy


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


    计算链表的长度, 然后移动较长链表的指针, 使其到同样结点的距离的同样, 再同一时候移动两个链表的指针, 找到同样元素.

    时间复杂度: O(n)


    代码:

    /*
     * main.cpp
     *
     *  Created on: 2014.6.12
     *      Author: Spike
     */
    
    /*eclipse cdt, gcc 4.8.1*/
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    struct ListNode {
    	int m_nKey;
    	ListNode* m_pNext;
    };
    
    size_t GetListLength (ListNode* pHead) {
    	size_t nLength = 0;
    	ListNode* pNode = pHead;
    	while (pNode != NULL) {
    		++nLength;
    		pNode = pNode->m_pNext;
    	}
    	return nLength;
    }
    
    ListNode* FindFirstCommonNode(ListNode* pHead1, ListNode* pHead2) {
    	size_t nLength1 = GetListLength(pHead1);
    	size_t 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;
    }
    
    int main(void)
    {
    	ListNode* pHead1 = new ListNode();
    	ListNode* pHead1Node1 = new ListNode();
    	ListNode* pHead1Node2 = new ListNode();
    	ListNode* pHead1Node3 = new ListNode();
    	ListNode* pHead1Node4 = new ListNode();
    	pHead1->m_nKey = 1;
    	pHead1Node1->m_nKey = 2;
    	pHead1Node2->m_nKey = 3;
    	pHead1Node3->m_nKey = 6;
    	pHead1Node4->m_nKey = 7;
    	pHead1->m_pNext = pHead1Node1;
    	pHead1Node1->m_pNext = pHead1Node2;
    	pHead1Node2->m_pNext = pHead1Node3;
    	pHead1Node3->m_pNext = pHead1Node4;
    	pHead1Node4->m_pNext = NULL;
    
    	ListNode* pHead2 = new ListNode();
    	ListNode* pHead2Node1 = new ListNode();
    	pHead2->m_nKey = 4;
    	pHead2Node1->m_nKey = 5;
    	pHead2->m_pNext = pHead2Node1;
    	pHead2Node1->m_pNext = pHead1Node3;
    
    	ListNode* result = FindFirstCommonNode(pHead1, pHead2);
    	printf("result = %d
    ", result->m_nKey);
    
        return 0;
    }
    

    输出:

    result = 6
    







  • 相关阅读:
    oo第四次总结
    oo第三次总结
    补给站总结
    OO第四次单元总结
    OO第三次单元总结
    OO第二次单元总结
    OO第一次单元总结
    提问回顾与个人总结
    软件工程结对作业博客
    OO第一次单元总结
  • 原文地址:https://www.cnblogs.com/yjbjingcha/p/6848217.html
Copyright © 2020-2023  润新知