编程之美---判断两个链表是否相交

首先,判断一个链表是否有环?

对于这个问题:可以用两个指针,刚开始都指向头节点,然后一个指针每次向后移一步,另一个指针每次向后移两步,如果最后移两步的指针为空时,说明无环,如果最后两个指针相等,说明有环。如果把第一指针看成静止,则相当于第二个每次走一步,所以在那个环上时,是一定能相遇的。

如何找到这个链表环的入口?

当这两个指针相遇后,把第一个指针移向头,两个指针每次都只移一步,再次相等时,就是环的入口。证明:设环上相遇位置为距离环入口处P,入口处前有M个节点,,环肾功能有N个节点,从入口处开始计时,则P1走了(M+P-M)%N,因为计时点为入口处,因为P2每次移两步,所以P2走了(2*(M+P)-M)%N,因为相遇,所以两指针位置一样,(M+P-M)%N=(2*(M+P)-M)%N,得X%N=(M+2*P)%N, 所以(M+P)%N=0。所以,当第一指针移M时,第二个指针也移M,此时,第二个指针在(M+P),因为(M+P)%N=0,所以第二个指针在入口处。

如何找到一个链表中倒数第K个节点?

可以设两个指针指向头节点,然后第二个先后移K步,然后两个同时移,第二个到最后,第一个指针的位置即为所求。

判断两个链表是否相交?

可以用两个指针,分别指向两个链表的头,都把它们移向表尾,如果最后这两个指针相等,则说明这两个链表相交。

原文地址:https://www.cnblogs.com/wen-ge/p/4159220.html