推荐给好友 上一篇 | 下一篇

《编程之美》读书笔记(十):“链表相交”扩展问题

*U'`CJ6c)R编程之美》3.6节“链表相交”扩展问题答案BSD爱好者乐园 PttIK-a"S ?q

扩展1:链表1 步长为1, 链表2步长为2 ,如果有环且相交则肯定相遇,否则不相交

Un;?3Sm"G!E'M(W i

list1 head: p1

6Vc jj!P;i-\ Dv R.U5R

list2 head: p2BSD爱好者乐园2[Sg]k"B"O5R/Yb

while( p1 != p2 && p1 != NULL && p2 != NULL )

F5SvIKh8H v

{

p n2X,?HW5| ]

      p1 = p1->next;

4ES3H:WRd

      if ( p2->next )

J%x%dst gf(x

         p2 = p2->next->next;

S ]IS1~u8f$y

      else

mt z2[%\.RVI

         p2 = p2->next;

Yh-^X m4|{

}

fi S M7RmD

BSD爱好者乐园H.E@0ZZ}9O

if ( p1 == p2 && p1 && p2) //相交BSD爱好者乐园 v8G w\a5~R3Jm [

else //不相交BSD爱好者乐园T~*J&@jAp]2T

 

;hV [@}V#G#r9U

扩展2:在判断是否相交的过程中要分别遍历两个链表,同时记录下各自长度。

UaS H2TZb?V

Node* step( Node* p, Node* q)BSD爱好者乐园-QYET1h/d0X3v%E9v

{BSD爱好者乐园,c!c~w;Jc _]

if ( !p || !q )BSD爱好者乐园 eZANg F K

return NULL;BSD爱好者乐园&XG6q9j ydV'C \)V

int pLen = 1;

!NvD0e#F(V X-i

int qLen = 1;

8o3R|.i%q%i

bool result = false;

7~`#`s S \

while( p->next )

\2dA&Z7Rmee,X(R

{BSD爱好者乐园9v$lWo*j2Q.H;Vu

pLen++, p = p->next;BSD爱好者乐园l } _+d.E$Ef.X

}

I;W}#Pq*r9YE&p0]

while( q->next )BSD爱好者乐园)x"n)cyjbO

{BSD爱好者乐园7b0x\W&E d%].u

qLen++, q = q->next;

8j6ez2BY?v3ON6h

}BSD爱好者乐园GX3H"YJR

result = ( p == q );BSD爱好者乐园j%\.UZ @6D!pl

if ( result )

"iO*\r$yQ@

{

x7}@Tg

 

n+b HiCQ!Fu
int steps = abs( pLen - qLen);BSD爱好者乐园;[XcG GK&M?H{3g
Node* head = pLen > qLen ? p : q;
I W@ F*v|/Twhile ( steps ) //对齐处理BSD爱好者乐园"zIi6g(h(B1t%M+V
{
Pm"W9hvE-D    head = head->next, steps--;

}

&u b y9H.{!iV1y

pLen > qLen ? p = head : q = head;

.BR Aio5pg

while ( p != q )

%i0I5E^5P}E"N

{

r&Qhe}M0|

p = p->next, q = q->next;BSD爱好者乐园jOJ:v$s[

}BSD爱好者乐园 `qv.pX

reutrn p;

]3R7H l;Q'M

}BSD爱好者乐园~ J&WtDx3m7H gV1`

return NULL;BSD爱好者乐园-M$?!t'A"ZC R

}BSD爱好者乐园7rrTRpglT


[重要提醒]对本篇资料有疑问,请到论坛讨论,尽量使文章准确无误>>>
[版权声明]BSD爱好者乐园站内文章,如来源不是互联网,则均系原创或翻译之作,可随意转载,或以此为基础进行演译,但务必以链接形式注明原始出处和作者信息,否则属于侵权行为。另对本站转载他处文章,俱有说明,如有侵权请联系本人,本人将会在第一时间删除侵权文章。
TAG: 编程之美 读书笔记
 

评分:0

我来说两句

seccode