|
题目 点击此处返回总目录 方法一 方法二
【题目】
【方法一】 哈哈,这是哪一年的考研题吧。找出两个相交链表的起始共同节点。因为链表只有唯一的后继,所以一旦相交,后面的部分肯定是重合的。不存在相交了又分开的情况。
共有两种方法。 第一种方法是先求出两个链表的长度lenA和lenB,然后长的链表先走|lenA-lenB|步。然后再一起走。
【方法一代码】
【方法一运行结果】
【方法二】 这种方法稍微复杂一点,比如下面:
让p和q一起走。p第一次走到null之后,接着走headB。q第一次走到null之后,接着走headA。所以p走完len(a)+len(c)+len(b)之后,q刚好走完len(b)+len(c)+len(a),再下一步就能碰头了。也就是刚好在c1处碰头。 即,p走:a1 -> a2 -> c1 -> c2 -> c3 -> b1 -> b2 -> b3 -> c1 -> c2 -> c3 q走:b1 -> b2 -> b3 -> c1 -> c2 -> c3 -> a1 -> a2 -> c1 -> c2 -> c3
【方法二代码】
【方法二运行结果】
也是2ms,跟方法一一样。
【方法二分析】 其实上面的代码看着简单,但是不是那么好写的。 上面的代码等价的代码如下: 要注意几个问题。
第92行(98行类似)为什么是p==null。而不是写p.next == null ?为什么不能改成下面的代码。
是因为存在以下两种情况。
第一种情况:一个为空,另一个不为空时。比如: A:[] B:[2,3] 正确代码运行过程如下: 初始:p = null(headA) q=2 p!=q p=2(headB) q=3 p!=q p=3 q = null p!=q p=null q=null(headA) p == q ,输出null
错误代码运行过程如下: 初始:p = null q = 2 p!=q p没有next ,报错!!
第二种情况:两个链表没有重合。比如: A:[1,2] B:[3,4,5] 正确代码运行过程如下: 初始: p=1 q=3 p!=q p=2 q=4 p!=q p=null q=5 p!=q p=3 q=null p!=q p=4 q=1 p!=q p=5 q=2 p!=q p=null q=null p==q 输出null
错误代码运行过程如下: 初始:p=1 q=3 p!=q p=2 q=4 p!=q p=3 q=5 p!=q p=4 q=1 p!=q p=5 q=2 p!=q p=3 q=1 p!=q p=4 q=2 p!=q p=5 q=1 p!=q p=3 q=2 p!=q p=4 q=1 ...... 错误代码会一直运行下去,永远也不结束。
|