https://leetcode.com/problems/intersection-of-two-linked-lists/
这道题一开始我想用hashtable做,就是先遍历第一个list,把node都放到hashset里面,然后遍历第二个,如果hashset里面有某个node,就说明这是intersection。
后来发现要求O(1) space,这样的话,先算两个list的长度,然后比较长的那个List先走两个长度的差那么多步,然后两个list再一起往前走,直到走到相同的node或者两个都为null为止。如果两个都为null,说明没有Intersection,不过在代码中不需要额外的分支来处理这个问题了,因为两个都是null也能相等,直接返回null就可以了。
public class Solution {
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
if(headA ==null || headB == null) return null;
ListNode tvs1 = headA;
int len1 = 0;
ListNode tvs2 = headB;
int len2 = 0;
while(tvs1 != null){
tvs1 = tvs1.next;
len1++;
}
while(tvs2 != null){
tvs2 = tvs2.next;
len2++;
}
int dif = Math.abs(len1-len2);
if(len1>=len2){
tvs1 = headA;
tvs2 = headB;
}
else{
tvs1 = headB;
tvs2 = headA;
}
while(dif>0){
tvs1 = tvs1.next;
dif--;
}
while(tvs1 != tvs2){
tvs1 = tvs1.next;
tvs2 = tvs2.next;
}
return tvs1;
}
}
本文介绍了一种求解两个链表交点的有效算法。该算法首先计算两个链表的长度,接着让较长的链表先移动长度差的步数,最后同步移动两个链表直至找到交点或同时到达尾部。
1058

被折叠的 条评论
为什么被折叠?



