题目描述:输入两个链表,找出它们的第一个公共结点。
题目分析:两个链表,当找到第一个相同的结点后,其后的所有结点都是相同的,是Y型。如果两个链表有公共结点,那么公共结点出现在两个链表的尾部。如果我们从两个链表的尾部开始往前比较,最后一个相同的结点就是我们要找的结点。
在上述思路中,我们需要用两个辅助钱。如果链表的长度分别为m 和n,那么空间复杂度是O(m+n)。这种思路的时间复杂度也是O(m+n)。
还有一种方案是,先行法。分别遍历一遍两个链表得出两个链表的长度分别是m和n,假如m>n,则让m链表先行m-n步,然后n表再开始走,当找到第一个相同结点,结束。时间复杂度都是O(m+n), 但我们不再需要辅助的栈,因此提高了空间效率。
public static int getListLength(ListNode head) {
int result = 0;
while (head != null) {
result++;
head = head.next;
}
return result;
}
public static ListNode findFirstCommonNode(ListNode head1, ListNode head2) {
int length1 = getListLength(head1);
int length2 = getListLength(head2);
int diff = length1 - length2;
ListNode listHeadLong = head1;
ListNode listHeadShort = head2;
if (diff < 0) {
listHeadLong = head2;
listHeadShort = head1;
diff = -diff;
}
for (int i = 0; i < diff; i++) {
listHeadLong = listHeadLong.next;
}
while (listHeadLong != null && listHeadShort != null && listHeadLong != listHeadShort) {
listHeadLong = listHeadLong.next;
listHeadShort = listHeadShort.next;
}
return listHeadLong;
}