160 找出两个链表的交点

题目                                                                                                                                         点击此处返回总目录

方法一

方法二

 


 

【题目】

 

【方法一】

哈哈,这是哪一年的考研题吧。找出两个相交链表的起始共同节点。因为链表只有唯一的后继,所以一旦相交,后面的部分肯定是重合的。不存在相交了又分开的情况。

 

共有两种方法。

第一种方法是先求出两个链表的长度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

......

错误代码会一直运行下去,永远也不结束。

 

 

 

 

 

 

 

 

 

 

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值