【追求进步】两个链表的第一个公共结点
2016-04-08 08:17
260 查看
题目描述
输入两个链表,找出它们的第一个公共结点。在线代码:
/* public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; } }*/ public class Solution { public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) { /* 分析题意有三种方法: 第一种方法:即就是遍历m和n链表,一个结点一个结点的比较是否有重合,这样的时间复杂度o(m*n) 第二种方法:借用辅助栈的方法,即就是从链表的尾端开始比较,这样的需要借助的空间o(m+n),时间复杂度也是o(m+n) 第三种方法:先行法,即就是先知道m链表比n链表大多少,然后让长的链表先走几步,接下来一个个的比较,看是否相等 */ int length1=getListLength(pHead1); int length2=getListLength(pHead2); int diff=length1-length2; ListNode longListNode=pHead1; ListNode shortListNode=pHead2; if(diff<0){ //如果第二个链表长度大于第一个 longListNode=pHead2; shortListNode=pHead1; diff=length2-length1; } for(int i=0;i<diff;i++){ longListNode=longListNode.next; //让长链表先走diff步 } //两个链表一起走,直到相等,然后返回第一个相交的结点 while(longListNode!=null&&shortListNode!=null &&longListNode!=shortListNode){ longListNode=longListNode.next; shortListNode=shortListNode.next; } return longListNode; } //求链表长度,遍历一次链表!注意:只能是这样呢 public int getListLength(ListNode head){ int result=0; while(head!=null){ result++; head=head.next; } return result; } }
相关文章推荐
- confirm使用方法
- 如何开展业务是我在离开X网之后重新学的
- Android:Material Design - Style - Color(转)
- FDMemTable内存表操作
- 关于笔试面试的文章
- 一来是为给我爹看,他老人家每周必读本系列
- 光驱无法识别,提示注册表信息不完整的解决办法
- 初学java随笔(1)
- warning:ISO C90 forbids mixed declarations and code
- 2016第七届蓝桥杯C/C++ B组省赛题解 C题 (全排列的学习)
- 在他带来的新浏览器中,充满了各种各样的个性化设定
- 27.String VS StringBuffer/Math/Arrays
- URIs, URLs, and URNs区别
- js实现几秒页面跳转的几种方式
- 键盘的出现于隐藏(解决键盘弹出时会覆盖文本框的问题,代码实现)
- 我的Android学习之旅(转)
- Unity3D游戏开发从零单排(三) - 极速创建狂拽酷炫的游戏地形
- 无题
- JavaScript的写类方式(6)
- nginx进程模型,事件模型