两个链表的第一个公共结点-输入两个链表,找出它们的第一个公共结点。
1、蛮力法:
1 /* 2 struct ListNode { 3 int val; 4 struct ListNode *next; 5 ListNode(int x) : 6 val(x), next(NULL) { 7 } 8 };*/ 9 class Solution { 10 public: 11 ListNode* FindFirstCommonNode( ListNode *pHead1, ListNode *pHead2) { 12 if(pHead1==NULL||pHead2==NULL) 13 return NULL; 14 ListNode* p1; 15 ListNode* p2; 16 for(p1=pHead1;p1!=NULL;p1=p1->next){ 17 for(p2=pHead2;p2!=NULL;p2=p2->next){ 18 if(p1==p2) 19 return p1; 20 } 21 } 22 return NULL; 23 } 24 };
2、
从链表的定义可以看出,这两个链表是单链表,如果两个链表有公共节点,那么这两个链表从某一节点开始,它们的m_pNext都指向同一个节点,之后它们所有的节点都是重合的,不可能再出现分叉。所以拓扑形状看起来是Y型。
一个简单的方法是:首先遍历两个链表得到它们的长度,就能知道哪个链表比较长,以及长的链表比短的链表多几个节点。在第二次遍历的时候,先在较长的节点上走若干步,接着同时在两个链表上遍历,找到的第一个相同的节点就是它们的公共的节点。
1 /* 2 struct ListNode { 3 int val; 4 struct ListNode *next; 5 ListNode(int x) : 6 val(x), next(NULL) { 7 } 8 };*/ 9 class Solution { 10 public: 11 ListNode* FindFirstCommonNode( ListNode *pHead1, ListNode *pHead2) { 12 if(pHead1==NULL||pHead2==NULL) 13 return NULL; 14 int l1=0,l2=0; 15 ListNode* p1=pHead1; 16 ListNode* p2=pHead2; 17 while(p1!=NULL){ 18 l1++; 19 p1=p1->next; 20 } 21 while(p2!=NULL){ 22 l2++; 23 p2=p2->next; 24 } 25 int d1=0,d2=0; 26 if(l1>l2) 27 d1=l1-l2; 28 if(l1<l2) 29 d2=l2-l1; 30 p1=pHead1; 31 p2=pHead2; 32 while(d1!=0){ 33 p1=p1->next; 34 d1--; 35 } 36 while(d2!=0){ 37 p2=p2->next; 38 d2--; 39 } 40 while(p1!=NULL&&p2!=NULL){ 41 if(p1==p2) 42 return p1; 43 p1=p1->next; 44 p2=p2->next; 45 } 46 return NULL; 47 } 48 };
转载于:https://www.cnblogs.com/zl1991/p/4775888.html
两个链表的第一个公共结点-输入两个链表,找出它们的第一个公共结点。相关推荐
- 输入两个链表,找出它们的第一个公共结点
package demo;import java.util.HashMap;/** 题目描述 输入两个链表,找出它们的第一个公共结点.*/ /* public class ListNode {int ...
- 美团点评_给出两个字符串(可能包含空格),找出其中最长的公共连续子串,输出其长度。
给出两个字符串(可能包含空格),找出其中最长的公共连续子串,输出其长度. import java.util.*; public class Meituan_4 {public static void ...
- 1.简述一个Activity跳转到另一个Activity时,两个Activity生命周期方法的执行过程。2.编写一个程序,要求在第一个界面中输入两个数字,在第二个界面显示第一个界面两个数字的和。
1.简述一个Activity跳转到另一个Activity时,两个Activity生命周期方法的执行过程. 首先,我创建了一个MainActivity和SecondActivity两个Activity. ...
- 刷题笔记之十 (小易的升级之路+找出字符串中第一个只出现一次的字符+洗牌+MP3光标位置)
目录 1.存取任意指定序号的元素和在最后进行插入和删除运算,利用顺序表存储最节省时间 2. 数据结构中具有记忆功能的是栈 3. 递归程序的优化一般为 尾递归优化 4.二叉树遍历,前中后序遍历用到的是栈 ...
- 算法Day8|字符串专题二 剑指 Offer 58 - II. 左旋转字符串,28. 找出字符串中第一个匹配项的下标,459. 重复的子字符串
剑指 Offer 58 - II. 左旋转字符串 解题思路: 反转区间为前n的子串 反转区间为n到末尾的子串 反转整个字符串 class Solution {public String reverse ...
- LeetCode 28. 找出字符串中第一个匹配项的下标 -- 字符串编码成数字匹配
找出字符串中第一个匹配项的下标 中等 1.6K 相关企业 给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标(下标从 ...
- 28.找出字符串中第一个匹配项的下标
28.找出字符串中第一个匹配项的下标 给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标(下标从 0 开始).如果 ...
- 找出字符串中第一个不重复的字符
找出字符串中第一个不重复的字符 leetcode原题地址 我的解决方法 将字符串转换成字符数组 使用两层循环遍历,最终根据第二层循环退出时的下标值来判断是否是不重复的字符 我的代码: public i ...
- 笔试强训第三周编程题part01(年终奖,迷宫问题;微信红包,计算字符串的距离;小易的升级之路,找出字符串中第一个只出现一次的字符,洗牌)
年终奖 OJ链接 此题是一道动态规划的问题 读题可知:只能从上往下和从左往右移动 由此需要前[i-1] [ j ]和[i][j-1]来比较大小来确实最优解. 其中有两种特殊情况,第一行和第一列 代码如 ...
- 题目:输入两个链表,找出它们的第一个公共结点。 单元测试
链表结点定义如下,这里使用C#语言描述: public class Node{public int key;public Node nextNode;public Node(int key){this ...
最新文章
- 【视频】谷歌大佬30分钟让你入门机器学习(2019谷歌I/O资源分享)
- ubuntu 打包压缩
- LeetCode Assign Cookies
- 【转】ArrayList Vector LinkedList 区别与用法
- bae java乱码_BAE json 返回乱码。
- TCP/IP 协议大致的概念
- java 代码生成器 generator
- Phantomjs 生成多页PDF
- dbeaver 设置编码_物料编码管理程序
- centeros安装mySQL
- 传输线变压器设计原理
- 游戏盾SDK的防护介绍
- quora 分享链接
- mysql orm_从MySQL到ORM(二):MySQL基础
- 同一网段分化vlan问题
- iPad最值得期待的切实改进构想
- Spring基础知识
- lg 传奇手游java_2020年手机游戏角色扮演类和传奇类 排行榜NO.1 小编强势推荐
- 搭建本地Spring Initializr服务(2020/4/17)
- 算法描述怎么写伪代码java_伪代码描述算法