您的位置:首页 > 其它

【追求进步】两个链表的第一个公共结点

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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: