JZ-C-37

剑指offer第三十七题:两个链表的第一个公共结点

  1 //============================================================================
  2 // Name        : JZ-C-37.cpp
  3 // Author      : Laughing_Lz
  4 // Version     :
  5 // Copyright   : All Right Reserved
  6 // Description : 两个链表的第一个公共结点
  7 //============================================================================
  8
  9 #include <iostream>
 10 #include <stdio.h>
 11 #include "List.h"
 12 using namespace std;
 13
 14 unsigned int GetListLength(ListNode* pHead);
 15 /**
 16  * 先移动长链表指针至某位置(与短链表持平),再同时遍历,遇到第一个相同的结点即为公共结点
 17  * 时间复杂度为O(m+n)
 18  */
 19 ListNode* FindFirstCommonNode(ListNode *pHead1, ListNode *pHead2) {
 20     // 得到两个链表的长度
 21     unsigned int nLength1 = GetListLength(pHead1);
 22     unsigned int nLength2 = GetListLength(pHead2);
 23     int nLengthDif = nLength1 - nLength2;
 24
 25     ListNode* pListHeadLong = pHead1;
 26     ListNode* pListHeadShort = pHead2;
 27     if (nLength2 > nLength1) {
 28         pListHeadLong = pHead2;
 29         pListHeadShort = pHead1;
 30         nLengthDif = nLength2 - nLength1;
 31     }
 32
 33     // 先在长链表上走几步,再同时在两个链表上遍历
 34     for (int i = 0; i < nLengthDif; ++i)
 35         pListHeadLong = pListHeadLong->m_pNext;
 36
 37     while ((pListHeadLong != NULL) && (pListHeadShort != NULL)
 38             && (pListHeadLong != pListHeadShort)) {
 39         pListHeadLong = pListHeadLong->m_pNext;//当不存在公共结点时,返回NULL
 40         pListHeadShort = pListHeadShort->m_pNext;
 41     }
 42
 43     // 得到第一个公共结点
 44     ListNode* pFisrtCommonNode = pListHeadLong;
 45
 46     return pFisrtCommonNode;
 47 }
 48
 49 unsigned int GetListLength(ListNode* pHead) {
 50     unsigned int nLength = 0;
 51     ListNode* pNode = pHead;
 52     while (pNode != NULL) {
 53         ++nLength;
 54         pNode = pNode->m_pNext;
 55     }
 56
 57     return nLength;
 58 }
 59
 60 // ====================测试代码====================
 61 void DestroyNode(ListNode* pNode);
 62
 63 void Test(char* testName, ListNode* pHead1, ListNode* pHead2,
 64         ListNode* pExpected) {
 65     if (testName != NULL)
 66         printf("%s begins: ", testName);
 67
 68     ListNode* pResult = FindFirstCommonNode(pHead1, pHead2);
 69     if (pResult == pExpected)
 70         printf("Passed.\n");
 71     else
 72         printf("Failed.\n");
 73 }
 74
 75 // 第一个公共结点在链表中间
 76 // 1 - 2 - 3  77 //            6 - 7
 78 //     4 - 5 /
 79 void Test1() {
 80     ListNode* pNode1 = CreateListNode(1);
 81     ListNode* pNode2 = CreateListNode(2);
 82     ListNode* pNode3 = CreateListNode(3);
 83     ListNode* pNode4 = CreateListNode(4);
 84     ListNode* pNode5 = CreateListNode(5);
 85     ListNode* pNode6 = CreateListNode(6);
 86     ListNode* pNode7 = CreateListNode(7);
 87
 88     ConnectListNodes(pNode1, pNode2);
 89     ConnectListNodes(pNode2, pNode3);
 90     ConnectListNodes(pNode3, pNode6);
 91     ConnectListNodes(pNode4, pNode5);
 92     ConnectListNodes(pNode5, pNode6);
 93     ConnectListNodes(pNode6, pNode7);
 94
 95     Test("Test1", pNode1, pNode4, pNode6);
 96
 97     DestroyNode(pNode1);
 98     DestroyNode(pNode2);
 99     DestroyNode(pNode3);
100     DestroyNode(pNode4);
101     DestroyNode(pNode5);
102     DestroyNode(pNode6);
103     DestroyNode(pNode7);
104 }
105
106 // 没有公共结点
107 // 1 - 2 - 3 - 4
108 //
109 // 5 - 6 - 7
110 void Test2() {
111     ListNode* pNode1 = CreateListNode(1);
112     ListNode* pNode2 = CreateListNode(2);
113     ListNode* pNode3 = CreateListNode(3);
114     ListNode* pNode4 = CreateListNode(4);
115     ListNode* pNode5 = CreateListNode(5);
116     ListNode* pNode6 = CreateListNode(6);
117     ListNode* pNode7 = CreateListNode(7);
118
119     ConnectListNodes(pNode1, pNode2);
120     ConnectListNodes(pNode2, pNode3);
121     ConnectListNodes(pNode3, pNode4);
122     ConnectListNodes(pNode5, pNode6);
123     ConnectListNodes(pNode6, pNode7);
124
125     Test("Test2", pNode1, pNode5, NULL);
126
127     DestroyList(pNode1);
128     DestroyList(pNode5);
129 }
130
131 // 公共结点是最后一个结点
132 // 1 - 2 - 3 - 4 133 //                7
134 //         5 - 6 /
135 void Test3() {
136     ListNode* pNode1 = CreateListNode(1);
137     ListNode* pNode2 = CreateListNode(2);
138     ListNode* pNode3 = CreateListNode(3);
139     ListNode* pNode4 = CreateListNode(4);
140     ListNode* pNode5 = CreateListNode(5);
141     ListNode* pNode6 = CreateListNode(6);
142     ListNode* pNode7 = CreateListNode(7);
143
144     ConnectListNodes(pNode1, pNode2);
145     ConnectListNodes(pNode2, pNode3);
146     ConnectListNodes(pNode3, pNode4);
147     ConnectListNodes(pNode4, pNode7);
148     ConnectListNodes(pNode5, pNode6);
149     ConnectListNodes(pNode6, pNode7);
150
151     Test("Test3", pNode1, pNode5, pNode7);
152
153     DestroyNode(pNode1);
154     DestroyNode(pNode2);
155     DestroyNode(pNode3);
156     DestroyNode(pNode4);
157     DestroyNode(pNode5);
158     DestroyNode(pNode6);
159     DestroyNode(pNode7);
160 }
161
162 // 公共结点是第一个结点
163 // 1 - 2 - 3 - 4 - 5
164 // 两个链表完全重合
165 void Test4() {
166     ListNode* pNode1 = CreateListNode(1);
167     ListNode* pNode2 = CreateListNode(2);
168     ListNode* pNode3 = CreateListNode(3);
169     ListNode* pNode4 = CreateListNode(4);
170     ListNode* pNode5 = CreateListNode(5);
171
172     ConnectListNodes(pNode1, pNode2);
173     ConnectListNodes(pNode2, pNode3);
174     ConnectListNodes(pNode3, pNode4);
175     ConnectListNodes(pNode4, pNode5);
176
177     Test("Test4", pNode1, pNode1, pNode1);
178
179     DestroyList(pNode1);
180 }
181
182 // 输入的两个链表有一个空链表
183 void Test5() {
184     ListNode* pNode1 = CreateListNode(1);
185     ListNode* pNode2 = CreateListNode(2);
186     ListNode* pNode3 = CreateListNode(3);
187     ListNode* pNode4 = CreateListNode(4);
188     ListNode* pNode5 = CreateListNode(5);
189
190     ConnectListNodes(pNode1, pNode2);
191     ConnectListNodes(pNode2, pNode3);
192     ConnectListNodes(pNode3, pNode4);
193     ConnectListNodes(pNode4, pNode5);
194
195     Test("Test5", NULL, pNode1, NULL);
196
197     DestroyList(pNode1);
198 }
199
200 // 输入的两个链表有一个空链表
201 void Test6() {
202     Test("Test6", NULL, NULL, NULL);
203 }
204
205 void DestroyNode(ListNode* pNode) {
206     delete pNode;
207     pNode = NULL;
208 }
209
210 int main(int argc, char** argv) {
211     Test1();
212     Test2();
213     Test3();
214     Test4();
215     Test5();
216     Test6();
217
218     return 0;
219 }
时间: 2024-08-26 07:58:04

JZ-C-37的相关文章

非越狱环境下从应用重签名到微信上加载Cycript

从零到一,非越狱环境下iOS应用逆向研究,从dylib注入,应用重签名到App Hook.文中用到的工具和编译好的dylib可在Github上下载. 注意!本文所有操作均在以下环境下成功进行,不同平台或环境可能存在某些问题,欢迎大家在issue中提出问题以及相互讨论. Mac OS X 10.11.6 (15G12a) Xcode 7.3.1 (7D1014) iPhone 5s, iOS 9.3.3 (13G21) 免费开发者账号 示例App:微信 v6.3.19.18 前言 提到非越狱环境下

第37天:小米手机图片展示

1.arguments对象alert(arguments.length);//返回实参的个数只在函数内使用arguments.callee;//返回正在执行的函数,也是在函数体内使用在函数递归调用时,推荐使用arguments.callee代替函数名本身function fn(){console.log(arguments.callee);} 1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <me

Java重写《C经典100题》 --37

[程序37] 题目:对10个数进行排序 1.程序分析:可以利用选择法,即从后9个比较过程中,选择一个最小的与第一个元素交换,下次类推,即用第二个元素与后8个进行比较,并进行交换.    2.程序源代码: 1 import java.util.Arrays; 2 import java.util.Random; 3 4 /** 5 * 6 *[程序37] 7 * 题目:对10个数进行排序. 8 * 程序分析:可以利用冒泡排序,当然也可以 Arrays.sort(); 9 * 为了看清楚排序的每一个

《Effective C++》:条款36-条款37

条款36绝不重新定义继承而来的non-virtual函数 条款37绝不要重新定义继承而来的缺省参数值 条款36:绝不重新定义继承而来的non-virtual函数 以一个例子来展开本条款阐述内容.假设class D是class B的派生类,class B中有一个public成员函数mf: class B{ public: void mf(); -- }; class D: public B {--}; 由一下方式调用 D x; B* pB=&x; pB->mf(); D* pD=&x;

Win32 汇编 - 跳转指令: JMP、JECXZ、JA、JB、JG、JL、JE、JZ、JS、JC、JO、JP 等

跳转指令分三类:一.无条件跳转: JMP;二.根据 CX.ECX 寄存器的值跳转: JCXZ(CX 为 0 则跳转).JECXZ(ECX 为 0 则跳转);三.根据 EFLAGS 寄存器的标志位跳转, 这个太多了. 根据标志位跳转的指令: JE ;等于则跳转 JNE ;不等于则跳转 JZ ;为 0 则跳转 JNZ ;不为 0 则跳转 JS ;为负则跳转 JNS ;不为负则跳转 JC ;进位则跳转 JNC ;不进位则跳转 JO ;溢出则跳转 JNO ;不溢出则跳转 JA ;无符号大于则跳转 JNA

Oracle性能优化之操作系统工具_超越OCP精通Oracle视频教程培训37

Oracle性能优化之操作系统工具_超越OCP精通Oracle视频教程培训37 课程介绍 风哥Oracle视频教程<<Oracle数据库性能优化培训教程>>的第7/10套:Oracle性能优化之操作系统性能工具.学习Oracle性能优化,1.操作系统性能优化分析及工具说明,操作系统性能工具之top/topas,vmstat,iostat,free/lsps/swapinfo,mpstat/sar,网络分析,基本信息查看,操作系统性能收集与分析之nmon,oswatcher. 视频教

纂篆我跟你不合适就像37码的鞋碰上了42码的脚一样不合适不怪鞋也不怪脚

赘专注左拙桩撞兹阻 我跟你不合适就像37码的鞋碰上了42码的脚一样不合适不怪鞋也不怪脚.. http://passport.baidu.com/?business&un=vip&un=%5F%E6%B8%85%E6%B5%A6%E6%8C%89%E6%91%A9%E7%BE%8E%E5%A5%B3%5F#0 http://passport.baidu.com/?business&un=vip&un=%5F%E8%BF%9E%E4%BA%91%E6%8C%89%E6%91%A

hdu 4435 第37届ACM/ICPC天津现场赛E题

转载请注明出处,谢谢http://blog.csdn.net/ACM_cxlove?viewmode=contents    by---cxlove 题目:给出N个城市,从1开始需要遍历所有点,选择一些点建立加油站,使得花费最少 这题的特殊性在于他的花费上,2^(i-1) 利用一个非常重要的性质,2^0+2^1+2^2……+2^i<2^(i+1) 所有编号<=i的所有点都建,总花费比建一个还少. 这里就贪心一下,先假设所有点都建,然后依次从编号大的删点,看看能不能遍历整个图 dist[i]表示

hdu 4431 第37届ACM/ICPC 天津赛区现场赛A题 枚举

题意:就是给了13张牌.问增加哪些牌可以胡牌.m是数字,s是条,p是筒,c是数字 胡牌有以下几种情况: 1.一个对子 +  4组 3个相同的牌或者顺子.  只有m.s.p是可以构成顺子的.东西南北这样的牌没有顺子. 2.7个不同的对子. 3.1m,9m,1p,9p,1s,9s,1c,2c,3c,4c,5c,6c,7c.  这13种牌每种都有,而且仅有这13种牌.肯定是有一种2张.其他的1张. 模拟即可,第一个对子的情况需要枚举 很麻烦的模拟,但是貌似稳银的很需要这题,所以这种难度必须要弄懂,加油

hdu 5203 &amp;&amp; BC Round #37 1002

代码参考自:xyz111 题意: 众所周知,萌萌哒六花不擅长数学,所以勇太给了她一些数学问题做练习,其中有一道是这样的:勇太有一根长度为n的木棍,这个木棍是由n个长度为1的小木棍拼接而成,当然由于时间放置的久了,一些小木棍已经不牢固了,所以勇太想让六花把这个木棍分成正整数长度的4段,其中有3段要没有不牢固的小木棍,勇太希望这3段木棍的长度和可以最大.同时六花希望在满足勇太要求的情况下让这三根木棍能拼成一个三角形,请问萌萌哒六花有多少种可行的分割方案呢?当然,这个问题对于萌萌哒六花来说实在是太难了