160. 相交链表
难度:简单
语言:java
题目内容
给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null 。
解法分析
本来现在我已经不记录简单题了,但是这题的解法很有意思,所以我还是记录一下,方便自己以后查看。解法真的还蛮多的
- 暴力解法:双重遍历似乎也是能过的,但是这个解法没啥意思就不说了
- 哈希表:因为哈希表在这里可以存地址,所以只要地址相同就有值重复的点啦,可以先遍历一条链表,再进行查询
- 这个是我想记录一下的解法,不仅仅适用于链表我觉得,很多位数不同的解法都可以使用这个思路。
答案还考虑了空链表问题,其实在这里不需要考虑,应该如果是空,那直接就返回null了
public class Solution {
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
ListNode pa = headA , pb = headB;
while(pa != pb){
pa = pa == null ? headB : pa.next;
pb = pb == null ? headA : pb.next;
}
return pa;
}
}
- 差值走法。这个方法本来我想的是,既然后面的值都相同,那只要用两个list存下所有的值,自后向前比较直到有不同的值即可,但是这样比较麻烦。有个更好的思路是先对两条链表扫描一遍,取得两者长度,然后让长的链表先走「两者的长度差值」,然后再同时走,遇到第一个节点即是答案。弥补两个值的区别就可以解决问题,并且不需要保存各个数的值了。
//直接借鉴宫水大神的解法粘贴。
public class Solution {
public ListNode getIntersectionNode(ListNode a, ListNode b) {
int c1 = 0, c2 = 0;
ListNode t1 = a, t2 = b;
while (t1 != null && ++c1 > 0) t1 = t1.next;
while (t2 != null && ++c2 > 0) t2 = t2.next;
int t = Math.abs(c1 - c2);
while (t-- > 0) {
if (c1 > c2) a = a.next;
else b = b.next;
}
while (a != null && b != null) {
if (a.equals(b)) {
return a;
} else {
a = a.next;
b = b.next;
}
}
return null;
}
}