问题概述
单链表定义如下:
public class ListNode {
int val;
ListNode next;
ListNode(int x) {
val = x;
next = null;
}
}
编写程序, 找出两个链表的交点。
如图所示,链表 A
和链表 B
在节点 8
处相交。
算法思路
首先确定一个事情:
如果两个链表有交点, 那么这两个链表的尾节点一定是相等的。
现在不仅需要判断是否有交点, 还需要找出这个节点。继续观察图形, 可以得出,如果两个链表相交,那么较长链表在往后移动 (
∣
l
e
n
g
t
h
1
−
l
e
n
g
t
h
2
∣
|length1-length2|
∣length1−length2∣)个长度单位后,两个链表往后查找的速度一致,即可以用判断两个节点是否相等的方式来判断交点的位置了。
代码实现:
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
if (headA==null||headB==null) {
return null;
}
int l1 = getListNodeLength(headA);
int l2 = getListNodeLength(headB);
boolean aLargerThanB = l1>l2;
//可以知道两个链表的长度
int abs = aLargerThanB?(l1-l2):(l2-l1);
if (abs!=0) {
if (aLargerThanB) {
while(abs>0) {
headA = headA.next;
abs--;
}
}else{
while(abs>0) {
headB = headB.next;
abs--;
}
}
}
while (headA!=null) {
if (headA==headB) {
return headA;
}
headA = headA.next;
headB = headB.next;
}
return null;
}
public int getListNodeLength(ListNode head) {
int length = 0;
while(head!=null) {
length++;
head = head.next;
}
return length;
}