题目:判断两个单向链表是否相交,假设两个链表均不存在环
算法思路:有两种方法,第一种方法就是在其中一个链表上顺序遍历每个节点,每遍历一个节点的时候,在另外一个链表上顺序遍历每个节点,如果便利过程中发现两个节点相同,说明此时链表相交,也就找到了他们的第一个公共节点,这个算法的时间复杂度是O(mn),比较耗时
第二种方法是比较简单一点的方法:首先依次遍历俩个链表的节点,求出两个链表的长度,算出两个链表的长度差,然后先在长的链表上遍历长度差个节点,之后在同步遍历,第一个相同的节点就是公共节点,这种方法的时间复杂度是O(m+n)
具体代码如下:
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
public class Solution {
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
if(headA==null||headB==null){
return null;
}
ListNode p=headA;
ListNode q=headB;
int length1=0;
int length2=0;
int diff=0;
while(p!=null){
length1++;
p=p.next;
}
while(q!=null){
length2++;
q=q.next;
}
if(length1>length2){
p=headA;
q=headB;
diff=length1-length2;
}
else{
p=headB;
q=headA;
diff=length2-length1;
}
for(int i=0;i<diff;i++){
p=p.next;
}
while(p!=null&&q!=null){
if(p.val==q.val){
return p;
}
p=p.next;
q=q.next;
}
return null;
}
}