编写一个程序,找到两个单链表相交的起始节点。
例如,下面的两个链表:
A: a1 → a2
↘
c1 → c2 → c3
↗
B: b1 → b2 → b3
在节点 c1 开始相交。
注意:
如果两个链表没有交点,返回 null.
在返回结果后,两个链表仍须保持原有的结构。
可假定整个链表结构中没有循环。
程序尽量满足 O(n) 时间复杂度,且仅用 O(1) 内存。
一开始就是两层循环进行,发现时间限制,之后根据提示可以用长度进行优化
public static ListNode getIntersectionNode(ListNode headA, ListNode headB) {
if(headA == null || headB == null){
return null;
}else {
ListNode list1 = headA;
ListNode list2 = headB;
int count1 = 0;
int count2 = 0;
while (list1 != null) {
count1++;
list1 = list1.next;
}
while (list2 != null) {
count2++;
list2 = list2.next;
}
int size = count1 > count2? count1 - count2: count2-count1;
if(count1 > count2){
ListNode list3 = headA;
ListNode list4 = headB;
while (size > 0) {
list3 = list3.next;
size--;
}
while (list3!=null) {
if(list3 == list4){
return list3;
}else {
list3 = list3.next;
list4 = list4.next;
}
}
}else {
ListNode list3 = headA;
ListNode list4 = headB;
while (size > 0) {
list4 = list4.next;
size--;
}
while (list4!=null) {
if(list3 == list4){
return list3;
}else {
list3 = list3.next;
list4 = list4.next;
}
}
}
}
return null;
}
一次性成功的代码,这是头一次,所以说思维清楚了代码也就很容易撸出来
排名比较高
贴出一个思路