剑指offer 37 - 两个链表的第一个公共节点
来源:互联网 发布:如何打开端口8081 编辑:程序博客网 时间:2024/04/30 08:31
首先遍历得到两个链表的长度,得到差值dif,较长的链表先移动dif步,然后同时在两个链表上便利,第一个相同的结点就是第一个公共结点
#include<iostream>using namespace std;struct ListNode{int m_nValue;ListNode *m_pNext;};ListNode *CreateListNode(int value){ListNode *node = new ListNode();node->m_nValue = value;node->m_pNext = NULL;return node;}void ConnectListNodes(ListNode *head,ListNode *next){if(head!=NULL){head->m_pNext = next;}}void DestroyList(ListNode* pHead){ListNode *pNode = pHead;while(pNode!=NULL){pHead = pHead->m_pNext;delete pNode;pNode = pHead;}}void DestroyNode(ListNode* pNode){delete pNode;pNode=NULL;}int getListLength(ListNode * pHead){ListNode *pNode = pHead;int len=0;while(pNode!=NULL){len++;pNode=pNode->m_pNext;}return len;}ListNode * FindFirstCommonNode( ListNode* pHead1, ListNode* pHead2){int pHead1Len = getListLength(pHead1);int pHead2Len = getListLength(pHead2);int difLen = pHead1Len - pHead2Len;ListNode* pLong = pHead1;ListNode* pShort = pHead2;if(difLen<0){difLen = - difLen;pLong = pHead2;pShort = pHead1;}for(int i=0;i<difLen;i++)pLong = pLong->m_pNext;while((pLong!=NULL) && (pShort!=NULL)&& (pLong!=pShort)){pLong = pLong->m_pNext;pShort = pShort->m_pNext;}ListNode *pFirst = pLong;return pFirst;}// ====================测试代码====================void Test(char* testName, ListNode* pHead1, ListNode* pHead2, ListNode* pExpected){ if(testName != NULL) printf("%s begins: ", testName); ListNode* pResult = FindFirstCommonNode(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);}int main(int argc, char* argv[]){ Test1(); Test2(); Test3(); Test4(); Test5(); Test6(); return 0;}
0 0
- 剑指offer-两个链表的第一个公共节点
- 【剑指offer】两个链表的第一个公共节点
- 剑指offer-两个链表的第一个公共节点
- 【剑指offer】两个链表的第一个公共节点
- 剑指offer------两个链表的第一个公共节点
- 《剑指offer》两个链表的第一个公共节点
- 剑指offer-两个链表的第一个公共节点
- 剑指offer--两个链表的第一个公共节点
- 剑指offer 两个链表的第一个公共节点
- 剑指offer--37两个单链表的第一个公共节点
- 【刷题剑指offer】两个链表的第一个公共节点
- 剑指offer面试题37 两个链表的第一个公共节点
- [剑指offer][面试题37]两个链表的第一个公共节点
- 剑指offer 面试题37—两个链表的第一个公共节点
- 剑指offer 37 - 两个链表的第一个公共节点
- 剑指offer 37:求两个链表的第一个公共节点
- 剑指Offer面试题37:两个链表的第一个公共节点
- 剑指Offer 37题 两个链表的第一个公共节点 Java版
- <s:select>控制为只读
- 旋转的太极
- open()与fopen()的区别
- 三星拍照旋转问题
- Linux 查看进程以及子进程/线程
- 剑指offer 37 - 两个链表的第一个公共节点
- Intersection of Two Linked Lists
- IE乱码火狐不乱码解决
- Spark实战
- 运用栈非递归遍历二叉树
- How do I add classes to main menu ul and li in Drupal 8
- mongrel
- Hibernate
- RabbitMq消息序列化简述