两个链表的第一个公共结点

来源:互联网 发布:怎么在淘宝网开网店 编辑:程序博客网 时间:2024/06/16 00:19

题目描述

输入两个链表,找出它们的第一个公共结点。
#include <iostream>#include "List.h"using namespace std;int GetLength(ListNode* pHead){int count = 0;ListNode* pNode = pHead;while(pNode != NULL){count++;pNode = pNode ->m_pNext;}return count;}ListNode* FirstCommonListNode(ListNode* pHead1, ListNode* pHead2){if(pHead1 == NULL || pHead2 == NULL)return NULL;int length1 = GetLength(pHead1);int length2 = GetLength(pHead2);int lengthDif = length1 - length2;ListNode* pHeadLong = pHead1;ListNode* pHeadSmall = pHead2;if(length2 > length1){lengthDif = length2 - length1;pHeadLong = pHead2;pHeadSmall = pHead1;}for(int i = 0; i < lengthDif; i++){pHeadLong = pHeadLong ->m_pNext;}while(pHeadLong != NULL && pHeadSmall != NULL && pHeadLong != pHeadSmall ){pHeadLong = pHeadLong ->m_pNext;pHeadSmall = pHeadSmall ->m_pNext;}ListNode* pListCommonNode = pHeadSmall;return pListCommonNode;}

// ====================测试代码====================void DestroyNode(ListNode* pNode);void Test(char* testName, ListNode* pHead1, ListNode* pHead2, ListNode* pExpected){    if(testName != NULL)        printf("%s begins: ", testName);    ListNode* pResult = FirstCommonListNode(pHead1, pHead2);    if(pResult == pExpected)        printf("Passed.\n");    else        printf("Failed.\n");}// 第一个公共结点在链表中间// 1 - 2 - 3 \//            6 - 7//     4 - 5 /void Test1(){    ListNode* pNode1 = CreateListNode(1);    ListNode* pNode2 = CreateListNode(2);    ListNode* pNode3 = CreateListNode(3);    ListNode* pNode4 = CreateListNode(4);    ListNode* pNode5 = CreateListNode(5);    ListNode* pNode6 = CreateListNode(6);    ListNode* pNode7 = CreateListNode(7);    ConnectListNodes(pNode1, pNode2);    ConnectListNodes(pNode2, pNode3);    ConnectListNodes(pNode3, pNode6);    ConnectListNodes(pNode4, pNode5);    ConnectListNodes(pNode5, pNode6);    ConnectListNodes(pNode6, pNode7);    Test("Test1", pNode1, pNode4, pNode6);    DestroyNode(pNode1);    DestroyNode(pNode2);    DestroyNode(pNode3);    DestroyNode(pNode4);    DestroyNode(pNode5);    DestroyNode(pNode6);    DestroyNode(pNode7);}// 没有公共结点// 1 - 2 - 3 - 4//            // 5 - 6 - 7void Test2(){    ListNode* pNode1 = CreateListNode(1);    ListNode* pNode2 = CreateListNode(2);    ListNode* pNode3 = CreateListNode(3);    ListNode* pNode4 = CreateListNode(4);    ListNode* pNode5 = CreateListNode(5);    ListNode* pNode6 = CreateListNode(6);    ListNode* pNode7 = CreateListNode(7);    ConnectListNodes(pNode1, pNode2);    ConnectListNodes(pNode2, pNode3);    ConnectListNodes(pNode3, pNode4);    ConnectListNodes(pNode5, pNode6);    ConnectListNodes(pNode6, pNode7);    Test("Test2", pNode1, pNode5, NULL);    DestroyList(pNode1);    DestroyList(pNode5);}// 公共结点是最后一个结点// 1 - 2 - 3 - 4 \//                7//         5 - 6 /void Test3(){    ListNode* pNode1 = CreateListNode(1);    ListNode* pNode2 = CreateListNode(2);    ListNode* pNode3 = CreateListNode(3);    ListNode* pNode4 = CreateListNode(4);    ListNode* pNode5 = CreateListNode(5);    ListNode* pNode6 = CreateListNode(6);    ListNode* pNode7 = CreateListNode(7);    ConnectListNodes(pNode1, pNode2);    ConnectListNodes(pNode2, pNode3);    ConnectListNodes(pNode3, pNode4);    ConnectListNodes(pNode4, pNode7);    ConnectListNodes(pNode5, pNode6);    ConnectListNodes(pNode6, pNode7);    Test("Test3", pNode1, pNode5, pNode7);    DestroyNode(pNode1);    DestroyNode(pNode2);    DestroyNode(pNode3);    DestroyNode(pNode4);    DestroyNode(pNode5);    DestroyNode(pNode6);    DestroyNode(pNode7);}// 公共结点是第一个结点// 1 - 2 - 3 - 4 - 5// 两个链表完全重合   void Test4(){    ListNode* pNode1 = CreateListNode(1);    ListNode* pNode2 = CreateListNode(2);    ListNode* pNode3 = CreateListNode(3);    ListNode* pNode4 = CreateListNode(4);    ListNode* pNode5 = CreateListNode(5);    ConnectListNodes(pNode1, pNode2);    ConnectListNodes(pNode2, pNode3);    ConnectListNodes(pNode3, pNode4);    ConnectListNodes(pNode4, pNode5);    Test("Test4", pNode1, pNode1, pNode1);    DestroyList(pNode1);}// 输入的两个链表有一个空链表void Test5(){    ListNode* pNode1 = CreateListNode(1);    ListNode* pNode2 = CreateListNode(2);    ListNode* pNode3 = CreateListNode(3);    ListNode* pNode4 = CreateListNode(4);    ListNode* pNode5 = CreateListNode(5);    ConnectListNodes(pNode1, pNode2);    ConnectListNodes(pNode2, pNode3);    ConnectListNodes(pNode3, pNode4);    ConnectListNodes(pNode4, pNode5);    Test("Test5", NULL, pNode1, NULL);    DestroyList(pNode1);}// 输入的两个链表有一个空链表void Test6(){    Test("Test6", NULL, NULL, NULL);}void DestroyNode(ListNode* pNode){    delete pNode;    pNode = NULL;}int main(int argc, char* argv[]){    Test1();    Test2();    Test3();    Test4();    Test5();    Test6();    return 0;}

0 0
原创粉丝点击