我哈希表的解法肯定是nlgn,而且正确性肯定没问题。CT的解法复杂度比我的好,O(n),只是怎么证明正确性?当
我的解法能用来证明Element A==Element B,而CT的解法使用了一个特性:只要两个链表相交,相交之后的元素就一定一样了。所以原子弹给出的例子
A-B-C-E-G-I-K 1-G-2-3-4-6
是不符合题意的。当link2上面有G的时候,下一个元素只能是I,然后K:
A-B-C-E-G-I-K 1-G-I-K
所以只要检查链尾相同就可以了(对没有闭环的情况)
对于有闭环的情况,如果二者相交,它们肯定在同一个闭环中间。(这时我前面没有想到的)。怎么证明 p1、p3每次+1, p2、p4每次+2, 比较p1和p4、 p2和p3, 如相同则有交叉。当p1==p2 AND p3==p4时stop,为什么这时候能肯定他们不相交?
补充一下这个解法:
设两对指针, p1,p2指link1, p3,p4 指link2, p1、p3每次+1, p2、p4每次+2, 比较p1和p4、 p2和p3, 如相同则有交叉。当p1==p2 AND p3==p4时stop。当p1,p2,p3,p4 ->next为空(即到达链尾)时保留原(链尾)值,这样就可以在最后比较链尾了。
现在请证明这个算法的正确性。
我的解法能用来证明Element A==Element B,而CT的解法使用了一个特性:只要两个链表相交,相交之后的元素就一定一样了。所以原子弹给出的例子
A-B-C-E-G-I-K 1-G-2-3-4-6
是不符合题意的。当link2上面有G的时候,下一个元素只能是I,然后K:
A-B-C-E-G-I-K 1-G-I-K
所以只要检查链尾相同就可以了(对没有闭环的情况)
对于有闭环的情况,如果二者相交,它们肯定在同一个闭环中间。(这时我前面没有想到的)。怎么证明 p1、p3每次+1, p2、p4每次+2, 比较p1和p4、 p2和p3, 如相同则有交叉。当p1==p2 AND p3==p4时stop,为什么这时候能肯定他们不相交?
补充一下这个解法:
设两对指针, p1,p2指link1, p3,p4 指link2, p1、p3每次+1, p2、p4每次+2, 比较p1和p4、 p2和p3, 如相同则有交叉。当p1==p2 AND p3==p4时stop。当p1,p2,p3,p4 ->next为空(即到达链尾)时保留原(链尾)值,这样就可以在最后比较链尾了。
现在请证明这个算法的正确性。