zoukankan      html  css  js  c++  java
  • 编程之美---判断两个链表是否相交

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

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

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

    当这两个指针相遇后,把第一个指针移向头,两个指针每次都只移一步,再次相等时,就是环的入口。证明:设环上相遇位置为距离环入口处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步,然后两个同时移,第二个到最后,第一个指针的位置即为所求。

    判断两个链表是否相交?

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

  • 相关阅读:
    node.js + expres 的安装
    ubuntu文件夹建立软链接方法
    $.ajax()方法所有参数详解;$.get(),$.post(),$.getJSON(),$.ajax()详解
    与 的区别
    ubuntu卸载软件命令,apt-get remove
    php中session机制的详解
    mysql中查询语句中的一个知识点说明
    Git忽略规则及.gitignore规则不生效的解决办法
    Linux中find常见用法示例
    Waiting for table metadata lock
  • 原文地址:https://www.cnblogs.com/wen-ge/p/4159220.html
Copyright © 2011-2022 走看看