两个链表的第一个公共结点
2015-09-03 20:50
399 查看
题目描述
输入两个链表,找出它们的第一个公共结点。#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 - 7 void 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; }
相关文章推荐
- Intellij IDEA 14.1.4 Scala开发环境搭建
- 走好选择的路
- 违例差错控制
- 线程间通信方式
- hdoj 1711 Number Sequence【kmp(数字数组)】
- 二叉树镜像 -- 递归法
- u-boot-2009.11移植(适用于TQ2440和MINI2440)第二篇:探索启动代码
- 回调机制的实现,即细看setOnClickListener怎么运行
- linux运维实战练习-2015年8月30日课程作业
- centos6.5 下搭建lamp环境
- gcc编译器默认支持的c语言标准
- linux下运行C程序
- Linux export 命令
- java 性能监控 jstack 线程死锁 JConsole 和 BTrace 图形化工具
- 指针与指针之间的减法运算以及比较运算
- 虚拟机上网
- LTE学习:CCE(2)
- 进程间通信方式
- hdu4548 美素数(素数打表)
- 例题解释A*