两个链表的第一个公共结点
来源:互联网 发布:adobe reader for mac 编辑:程序博客网 时间:2024/06/05 06:47
1.题目描述
输入两个链表,找出它们的第一个公共结点。
传送门
2.code(java1.7版本)
复杂度O(n+a+b)
/*public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; }}*/public class Solution { public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) { ListNode p1=pHead1; ListNode p2=pHead2; while(p1!=p2){ if(p1!=null)p1=p1.next; if(p2!=null)p2=p2.next; if(p1!=p2){ if(p1==null)p1=pHead2; if(p2==null)p2=pHead1; } } return p1; }}
复杂度O(n2)
/*public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; }}*/public class Solution { public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) { ListNode p1=pHead1; ListNode p2=pHead2; while(p1!=null){ p2=pHead2; while(p2!=null){ if(p1==p2)return p1; else p2=p2.next; } p1=p1.next; } return p1; }}
复杂度O(nlog(n))
/*public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; }}*/import java.util.*;public class Solution { public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) { ListNode p=pHead1; HashMap<ListNode,Integer> map=new HashMap<ListNode,Integer>(); while(p!=null){ map.put(p,1); p=p.next; } p=pHead2; while(p!=null){ if(map.containsKey(p)){ return p; } else p=p.next; } return null; }}
3.解题思路
复杂度O(n+a+b)
假定 List1长度: a+n List2 长度:b+n, 且 a小于b,那么 p1 会先到链表尾部, 这时p2 走到 a+n位置,将p1换成List2头部,接着p2 再走b+n-(n+a) =b-a 步到链表尾部,这时p1也走到List2的b-a位置,还差a步就到可能的第一个公共节点。 将p2 换成 List1头部,p2走a步也到可能的第一个公共节点。如果恰好p1==p2,那么p1就是第一个公共节点。 或者p1和p2一起走n步到达列表尾部,二者没有公共节点,退出循环。 同理a>=b.时间复杂度O(n+a+b)。
复杂度O(n2)
也就是按个遍历一个链表的值,并在另外一个链表里面遍历查看是否有相同的值,返回第一个相同的节点位置,没有则返回null,遍历完整个链表即可完成相同节点的搜寻。
复杂度O(nlog(n))
这样的算法的思想和复杂度O(n2)算法的思想是一样的,不同的地方就在于相同节点的查询,这样的算法运用了HashMap进行原始链表的保存,这样可以将查询的时间变为logn,最终的复杂度为nlogn。
阅读全文
1 0
- 找出两个链表的第一个公共结点--总结
- 找出两个链表的第一个公共结点
- 找两个链表的第一个公共结点
- 找出两个链表的第一个公共结点
- 找出两个链表的第一个公共结点
- 找出两个链表的第一个公共结点
- 找出两个链表的第一个公共结点
- 找出两个链表的第一个公共结点
- 两个链表的第一个公共结点
- 找出两个链表的第一个公共结点
- 两个链表的第一个公共结点
- 两个链表的第一个公共结点
- 两个链表的第一个公共结点
- 找两个链表的第一个公共结点
- 两个链表的第一个公共结点(剑指offer37)
- 【剑指offer】两个链表的第一个公共结点
- 题目1505:两个链表的第一个公共结点
- 两个链表的第一个公共结点
- 关闭CMD进程-JAVA
- InteliJ Idea pom.xml不自动提示的解决
- System.getProperty("line.separator") 的含义
- java 方式配置spring mvc 继承WebMvcConfigurerAdapter和继承WebMvcConfigurationSupport
- 工厂方法模式
- 两个链表的第一个公共结点
- Docker制作数据库中间件Mycat源码镜像
- OPENCV学习一(滤波)
- 如果 TCP 协议中三次握手不携带序列号,会造成什么样的后果
- 一个界面出现多个seekbar的时候导致seekbar滑动不灵敏的问题
- 1041. 考试座位号(15)
- 21.缺陷管理工具(1)
- git branch用法总结
- Eclipse和MyEclipse中导入java注解模板