题目
请写一个程序,找到两个单链表最开始的交叉节点。
注意事项
如果两个链表没有交叉,返回null。
在返回结果后,两个链表仍须保持原有的结构。
可假定整个链表结构中没有循环。
样例
下列两个链表:
在节点 c1 开始交叉。
解题
单链表有交叉一定是上图的形式:两个指针指向同一个结点,之后不在分离。如果分了就出现一个指针指向两个结点的情况,这个时候就不是单链表了。
根据上图:先求出两个链表长度的差,根据差值,长链表,结点后移这个差值,之后两个链表的指针一起走,当相遇的时候就是第一个公共结点
public class Solution {
/**
* @param headA: the first list
* @param headB: the second list
* @return: a ListNode
*/
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
// Write your code here
ListNode p1 = headA;
ListNode p2 = headB;
if(p1==null || p2==null)
return null;
int lenA = getLength(p1);
int lenB = getLength(p2);
int diff = lenA - lenB;
if(diff<0)
return getIntersectionNode(p2,p1);
while(diff>=1){
p1 = p1.next;
diff--;
}
while(p1!=null && p2!=null){
if(p1==p2)
return p1;
p1 = p1.next;
p2 = p2.next;
}
return null;
}
public int getLength(ListNode head){
ListNode p = head;
int len = 0;
while(p!=null){
p = p.next;
len++;
}
return len;
}
}
稍作更改
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
// Write your code here
ListNode p1 = headA;
ListNode p2 = headB;
if(p1==null || p2==null)
return null;
int lenA = getLength(p1);
int lenB = getLength(p2);
int diff = lenA - lenB;
if(diff<0)
return getIntersectionNode(p2,p1);
while(p1!=null && p2!=null){
if(diff>=1){
p1 = p1.next;
diff--;
}else{
if(p1==p2)
return p1;
p1 = p1.next;
p2 = p2.next;
}
}
return null;
}