剑指offer系列62---两个链表的公共结点
【题目】输入两个链表,找出它们的第一个公共结点。
* 【思路】1 获取两链表的长度;
* 2 让长的链表先走n步后此时走到短链表起始位置;
* 3 两链表同时遍历,直至相同,这时返回第一个公共结点。
package com.exe11.offer; /**
* 【题目】输入两个链表,找出它们的第一个公共结点。
* 【思路】1 获取两链表的长度;
* 2 让长的链表先走n步后此时走到短链表起始位置;
* 3 两链表同时遍历,直至相同,这时返回第一个公共结点。
* @author WGS
*
*/
public class CommonListNode { static class ListNode{
int val;
ListNode next=null;
public ListNode(int val){
this.val=val;
}
}
public ListNode getCommonNode(ListNode pHead1,ListNode pHead2){
if(pHead1==null ||pHead2==null)
return null;
//1 获取两个链表长度
int len1=getListNodeLength(pHead1);
int len2=getListNodeLength(pHead2);
//2 比较长度
int difVal=len1-len2;
ListNode longListNode=pHead1;
ListNode shortListNode=pHead2;//假设pHead1长,pHead2短
if(difVal<0){//len1<len2,pHead2长
longListNode=pHead2;
shortListNode=pHead1;
difVal=len2-len1;
}
//3 让长的先走n(difVal)步
for(int i=0;i<difVal;i++){
longListNode=longListNode.next;
}
//4 再一起走
while(longListNode!=null && shortListNode!=null &&(longListNode.val!=shortListNode.val)){
//当碰到相同值即为公共结点,跳出循环
if(shortNode.val==longNode.val){
return longNode;
}
longListNode=longListNode.next;
shortListNode=shortListNode.next;
}
//当碰到相同值即为公共结点,跳出循环
ListNode commonNode=longListNode;
/*if(longListNode.val==shortListNode.val){
commonNode=shortListNode;//返回 公共结点
}*/ return commonNode; }
//获取链表长度
private int getListNodeLength(ListNode pHead){
ListNode node=pHead;
int len=0;
while(node!=null){
len++;
node=node.next;
}
return len;
} public static void main(String[] args) {
ListNode pHead1 = new ListNode(1);
ListNode node1 = new ListNode(2);
ListNode node2 = new ListNode(3);
ListNode node3 = new ListNode(4);
// ListNode node4 = new ListNode(7);
pHead1.next = node1;
node1.next = node2;
node2.next = node3;
//node3.next = node4; ListNode pHead2 = new ListNode(5);
ListNode node5 = new ListNode(6);
ListNode node6 = new ListNode(7);
// ListNode node7 = new ListNode(7);
pHead2.next = node5;
node5.next = node6;
// node6.next = node7; CommonListNode c=new CommonListNode();
ListNode node=c.getCommonNode(pHead1, pHead2);
System.out.println(node); } }
或者,用一个集合先把第一个链表所有值加入,再依次跟第二个链表值比较,当有第一个相同时即为第一个公共结点。
package com.exe11.offer; import java.util.HashMap; /**
* 【题目】输入两个链表,找出它们的第一个公共结点。
* 【思路】1 获取两链表的长度;
* 2 让长的链表先走n步后此时走到短链表起始位置;
* 3 两链表同时遍历,直至相同,这时返回第一个公共结点。
* @author WGS
*
*/
public class CommonListNode2 { static class ListNode{
int val;
ListNode next=null;
public ListNode(int val){
this.val=val;
}
}
public ListNode getCommonNode(ListNode pHead1,ListNode pHead2){
HashMap<ListNode,Integer> map=new HashMap<>();
//先把pHead1值全部添加至集合中
while(pHead1!=null){
map.put(pHead1, 1);
pHead1=pHead1.next;
}
//
//ListNode commonNode=null;
while(pHead2!=null){
Integer node=map.get(pHead2);
if(node!=null)
return pHead2;
pHead2=pHead2.next;
}
return null; } public static void main(String[] args) {
ListNode pHead1 = new ListNode(1);
ListNode node1 = new ListNode(2);
ListNode node2 = new ListNode(3);
ListNode node3 = new ListNode(4);
// ListNode node4 = new ListNode(7);
pHead1.next = node1;
node1.next = node2;
node2.next = node3;
//node3.next = node4; ListNode pHead2 = new ListNode(5);
ListNode node5 = new ListNode(6);
ListNode node6 = new ListNode(7);
// ListNode node7 = new ListNode(7);
pHead2.next = node5;
node5.next = node6;
// node6.next = node7; CommonListNode2 c=new CommonListNode2();
ListNode node=c.getCommonNode(pHead1, pHead2);
System.out.println(node.val); } }
剑指offer系列62---两个链表的公共结点的更多相关文章
- 【剑指offer】52. 两个链表的第一个公共节点
剑指 Offer 52. 两个链表的第一个公共节点 知识点:链表: 题目描述 输入两个链表,找出它们的第一个公共节点. 如下面的两个链表: 示例 示例1: 输入:intersectVal = 8, l ...
- 剑指offer七:两个链表的第一个公共结点
输入两个链表,找出它们的第一个公共结点. import java.util.*; public class Solution { public ListNode FindFirstCommonNode ...
- 【剑指Offer】52. 两个链表的第一个公共节点 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 解题方法 方法一:栈 方法二:HashSet 方法三:不使用额外空间 日期 ...
- 剑指offer系列——62.二叉搜索树的第k个结点
Q:给定一棵二叉搜索树,请找出其中的第k小的结点.例如, (5,3,7,2,4,6,8) 中,按结点数值大小顺序第三小结点的值为4. T: 中序遍历,递归: int count = 0; public ...
- 《剑指offer》 合并两个排序的链表
本题来自<剑指offer> 合并两个排序的链表 题目: 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. 思路: A:采用递归的方式(C++ C ...
- 剑指Offer:合并两个排序的链表【25】
剑指Offer:合并两个排序的链表[25] 题目描述 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. 题目分析 每次都是比较箭头节点,把小节点连接到已经合 ...
- 剑指 Offer 25. 合并两个排序的链表
剑指 Offer 25. 合并两个排序的链表 Offer 25 该问题的原型就是多项式的合并. 实现较简单,没有特殊需要注意的问题. package com.walegarrett.offer; /* ...
- 【剑指Offer】合并两个排序的链表 解题报告(Python)
[剑指Offer]合并两个排序的链表 解题报告(Python) 标签(空格分隔): LeetCode 题目地址:https://www.nowcoder.com/ta/coding-interview ...
- 剑指Offer - 九度1524 - 复杂链表的复制
剑指Offer - 九度1524 - 复杂链表的复制2014-02-07 01:30 题目描述: 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点 ...
- 干货 | 剑指offer系列文章汇总
下面是名企面试中经常会出现的面试题目,大家可以戳相应的题目查看题目细节,其答案会在紧接着的后一篇中出现 剑指offer系列 始 剑指offer—灯管问题(1) 剑指offer—10人电梯(2) ...
随机推荐
- Think Python - Chapter 8 - Strings
8.1 A string is a sequenceA string is a sequence of characters. You can access the characters one at ...
- hdu 5206 Four Inages Strategy
题目大意: 判断空间上4个点是否形成一个正方形 分析: 标称思想 : 在p2,p3,p4中枚举两个点作为p1的邻点,不妨设为pi,pj,然后判断p1pi与p1pj是否相等.互相垂直,然后由向量法,最后 ...
- ZSDRM001-发货清单
REPORT ZSDRM001 LINE-SIZE 225 LINE-COUNT 65 NO STANDARD PAGE HEADING.*------------------------------ ...
- C++ Primer : 第十章 : 泛型算法 之 只读、写和排序算法
大多数算法都定义在<algorithm>头文件里,而标准库还在头文件<numeric>里定义了一组数值泛型算法,比如accumulate. ● find算法,算法接受一对迭代 ...
- c 函数及指针学习 8
联合体 1 2 3 4 5 6 7 8 9 10 11 12 13 #include <stdio.h> union sa { double a; int b; ...
- (转)PK系列之六:该不该读中文翻译的专业书
本文引用地址:http://blog.sciencenet.cn/blog-2999994-956596.html 此文来自科学网王立新博客,转载请注明出处. 刘新建:这几天在读一本译著:投入产出分析 ...
- 虚拟化_KVM
一.KVM介绍 1.KVM全称kernel vitual machine,是针对包含虚拟化扩展(InterVT或AMD-V)的x86硬件上的完全原生的虚拟化解决方案 2.KVM是以色列Qumranet ...
- 附录二 C语言标准库
上章回顾 数组和指针相同与不同 通过指针访问数组和通过数组访问指针 指针在什么时候可以加减运算 函数指针的申明和调用 函数数组和数组函数 git@github.com:Kevin-Dfg/Data-S ...
- 黑马程序员——JAVA基础之简述多线程,两种创建多线程的方式
------- android培训.java培训.期待与您交流! ---------- 多线程: 进程和线程: 进程:是一个正在执行中的程序.每一个进程执行都有一个执行顺序.该顺序是一个执行路径,或者 ...
- 谷歌大牛Jeff Dean是如何成为互联网战神的
“光在真空中的速度曾经是大约每小时35英里,然后Jeff Dean花了一个周末优化了基础物理学.”——出自“关于Jeff Dean的事实” 其实,“关于Jeff Dean的事实”这个G+帖中描述的并非 ...