两个链表的第一个公共结点
来源:互联网 发布:怎么在淘宝网开网店 编辑:程序博客网 时间: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
- 找出两个链表的第一个公共结点--总结
- 找出两个链表的第一个公共结点
- 找两个链表的第一个公共结点
- 找出两个链表的第一个公共结点
- 找出两个链表的第一个公共结点
- 找出两个链表的第一个公共结点
- 找出两个链表的第一个公共结点
- 找出两个链表的第一个公共结点
- 两个链表的第一个公共结点
- 找出两个链表的第一个公共结点
- 两个链表的第一个公共结点
- 两个链表的第一个公共结点
- 两个链表的第一个公共结点
- 找两个链表的第一个公共结点
- 两个链表的第一个公共结点(剑指offer37)
- 【剑指offer】两个链表的第一个公共结点
- 题目1505:两个链表的第一个公共结点
- 两个链表的第一个公共结点
- 指针与指针之间的减法运算以及比较运算
- C++模板类编写需要注意的一点
- hdu 2222 Keywords Search (ac自动机)
- hdoj 1711 Number Sequence【kmp(数字数组)】
- 回调机制的实现,即细看setOnClickListener怎么运行
- 两个链表的第一个公共结点
- 违例差错控制
- 二叉树镜像 -- 递归法
- android:installLocation简析
- android app反编译
- 线程协作-生产者/消费者问题
- 【Hadoop】Avro源码分析(一):Schema
- iphone开发之表格组件UITableView的使用(七)实现数据刷新
- quartz 相关源码解析