一、笔记部分
思路:往前走你会发现可能不同,开始到相交处是不一样的。但是后面的链表却是相同的,那么如果能从后面往前,找到就好了。但是链表只能从前往后走,进行反转链表就很需要时间复杂度了。
O(N):
public class Solution {
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
if(headA==null||headB==null)
{
return null;
}
int len_A=0;
int len_B=0;
ListNode temp_headA=headA;
ListNode temp_headB=headB;
while( temp_headA.next!=null){
len_A++;
temp_headA=temp_headA.next;
}
while(temp_headB.next!=null){
len_B++;
temp_headB=temp_headB.next;
}
if(len_A>len_B){
temp_headA=headA;
temp_headB=headB;
for(int i=0;i<len_A-len_B;++i){
temp_headA=temp_headA.next;
}
while(temp_headA.next!=null||temp_headB.next!=null){
if(temp_headA.next==temp_headB.next)
return temp_headA.next;
temp_headA=temp_headA.next;
temp_headB=temp_headB.next;
}
}
else{
temp_headA=headA;
temp_headB=headB;
if(len_B==1&&len_A==1)
{
if(temp_headA==temp_headB)
return temp_headA;
}
for(int i=0;i<len_B-len_A;++i){
temp_headB=temp_headB.next;
}
while(temp_headA.next!=null||temp_headB.next!=null){
if(temp_headA.next==temp_headB.next)
return temp_headA.next;
temp_headA=temp_headA.next;
temp_headB=temp_headB.next;
}
}
return null;
}
}
可以先求出两个链表长度,然后长的先走多余的步数,然后一起比较是否相等,有相等就True.
这种记录链表长度的方法超级Low,还因为1不好判断而还不行。。链表只有一个元素的时候一定要注意。因为链表的循环都是基于下一个不为空,如果只有一个的话,怎么提取出来呢?
用某一个链表遍历完后,就直接从另外一个开始遍历,那么就先走了两个链表的差值了!!!!!,互相调换遍历链表,就相当于求差。如下
1.比较的是内存,而不是值!!!
2.不能是判断下一个是否为空,这个是直接在屁股后面添加另外个链表,肯定是从Null的地方添加。
更秀的操作就是:
1.直接看最后一个是不是相等,保存每个链表的最后一节点比较。这个只是看是否存在交点。
第三种方法:
1.A,B两个链表,谁先走到尾了,就去对方的链表走,然后另外个走到头也交换走。这样他们实则就同步再走了。
这样交替走一轮,互补解决两个链表不一致的问题。
二、链表类型的高频面试题汇总:
https://blog.csdn.net/qq_40262372/article/details/112850324
三、各种类型的高频面试题汇总:
https://blog.csdn.net/qq_40262372/article/details/112556249