当前位置:首页 > PHP教程 > php高级应用 > 列表

PHP学习之查找两个链表的第一个公共结点

发布:smiling 来源: PHP粉丝网  添加日期:2020-04-04 22:10:43 浏览: 评论:0 

本篇文章小编将带大家学习用PHP实现查找两个链表的第一个公共结点,具有一定的参考价值,感兴趣的朋友可以看看,希望对你有所帮助。

输入两个链表,找出它们的第一个公共结点

1.两个单链表,有公共结点,那么必然,尾部公用

2.找出链表1的长度,找出链表2的长度,长的链表减去短的链表得出一个n值

3.长的链表先走n步,两个链表再同时移动

4.两个链表相交点就是第一个公共结点

  1. list1 list2 
  2.  
  3. len1 len2 
  4.  
  5.   
  6.  
  7. if len1 > len2 
  8.  
  9.     n=len1-len2 
  10.  
  11.     for i=0;i<n;i++ 
  12.  
  13.         list1=list1->next 
  14.  
  15. else 
  16.  
  17.     n=len2-len1 
  18.  
  19.     for i=0;i<n;i++ 
  20.  
  21.         list2=list2->next 
  22.  
  23.   
  24.  
  25. while list1!=null 
  26.  
  27.     if list1==list2  
  28.  
  29.         return list1 
  30.  
  31.     list1=list1->next 
  32.  
  33.     list2=list2->next 
  34.  
  35. return null 
  36.  
  37. <?php 
  38.  
  39. class Node{ 
  40.  
  41.         public $data; 
  42.  
  43.         public $next; 
  44.  
  45.         public function __construct($data=""){ 
  46.  
  47.                 $this->data=$data; 
  48.  
  49.         }    
  50.  
  51. } 
  52.  
  53. //构造一个链表 
  54.  
  55. $linkList1=new Node(); 
  56.  
  57. $linkList1->next=null; 
  58.  
  59. $temp=$linkList1;  
  60.  
  61. $node1=new Node(1); 
  62.  
  63. $temp->next=$node1; 
  64.  
  65. $temp=$node1;  
  66.  
  67. $node2=new Node(2); 
  68.  
  69. $temp->next=$node2; 
  70.  
  71. $temp=$node2; 
  72.  
  73. $node3=new Node(3); 
  74.  
  75. $temp->next=$node3; 
  76.  
  77. $temp=$node3;  
  78.  
  79. $node4=new Node(4); 
  80.  
  81. $temp->next=$node4; 
  82.  
  83. $temp=$node4; 
  84.  
  85. $node5=new Node(5); 
  86.  
  87. $temp->next=$node5; 
  88.  
  89. $node5->next=null; 
  90.  
  91. //构造一个和上面有公共结点的链表 
  92.  
  93. $linkList2=new Node(); 
  94.  
  95. $linkList2->next=null; 
  96.  
  97. $temp=$linkList2; 
  98.  
  99. $node7=new Node(7); 
  100.  
  101. $temp->next=$node7; 
  102.  
  103. $node7->next=$node4;//链向上面链表的第四个结点   
  104.  
  105. var_dump($linkList1); 
  106.  
  107. var_dump($linkList2); 
  108.  
  109. $commonNode=FindFirstCommonNode($linkList1,$linkList2); 
  110.  
  111. var_dump($commonNode); 
  112.  
  113. //找第一个公共结点 
  114.  
  115. function FindFirstCommonNode($pHead1, $pHead2){ 
  116.  
  117.         //链表1的长度 
  118.  
  119.         $len1=0; 
  120.  
  121.         $temp=$pHead1->next; 
  122.  
  123.         while($temp!=null){ 
  124.  
  125.                 $temp=$temp->next; 
  126.  
  127.                 $len1++; 
  128.  
  129.         } 
  130.  
  131.         //链表2的长度 
  132.  
  133.         $len2=0; 
  134.  
  135.         $temp=$pHead2->next; 
  136.  
  137.         while($temp!=null){ 
  138.  
  139.                 $temp=$temp->next; 
  140.  
  141.                 $len2++; 
  142.  
  143.         } 
  144.  
  145.         $list1=$pHead1->next; 
  146.  
  147.         $list2=$pHead2->next; 
  148.  
  149.         //长的链表先走n步 
  150.  
  151.         if($len1 > $len2){ 
  152.  
  153.                 $n=$len1-$len2; 
  154.  
  155.                 for($i=0;$i<$n;$i++){ 
  156.  
  157.                         $list1=$list1->next; 
  158.  
  159.                 } 
  160.  
  161.         }else{ 
  162.  
  163.                 $n=$len2-$len1; 
  164.  
  165.                 for($i=0;$i<$n;$i++){ 
  166.  
  167.                         $list2=$list2->next; 
  168.  
  169.                 } 
  170.  
  171.   
  172.  
  173.         } 
  174.  
  175.         //两个链表长度一致,同时走,第一个相同的点就是第一个公共结点 
  176.  
  177.         while($list1!=null){ 
  178.  
  179.                 if($list1==$list2){ 
  180.  
  181.                         return $list1; 
  182.  
  183.                 } 
  184.  
  185.                 $list1=$list1->next; 
  186.  
  187.                 $list2=$list2->next; 
  188.  
  189.         } 
  190.  
  191.         return null; 
  192.  
  193. } 
  194.  
  195. object(Node)#1 (2) { 
  196.  
  197.   ["data"]=> 
  198.  
  199.   string(0) "" 
  200.  
  201.   ["next"]=> 
  202.  
  203.   object(Node)#2 (2) { 
  204.  
  205.     ["data"]=> 
  206.  
  207.     int(1) 
  208.  
  209.     ["next"]=> 
  210.  
  211.     object(Node)#3 (2) { 
  212.  
  213.       ["data"]=> 
  214.  
  215.       int(2) 
  216.  
  217.       ["next"]=> 
  218.  
  219.       object(Node)#4 (2) { 
  220.  
  221.         ["data"]=> 
  222.  
  223.         int(3) 
  224.  
  225.         ["next"]=> 
  226.  
  227.         object(Node)#5 (2) { 
  228.  
  229.           ["data"]=> 
  230.  
  231.           int(4) 
  232.  
  233.           ["next"]=> 
  234.  
  235.           object(Node)#6 (2) { 
  236.  
  237.             ["data"]=> 
  238.  
  239.             int(5) 
  240.  
  241.             ["next"]=> 
  242.  
  243.             NULL 
  244.  
  245.           } 
  246.  
  247.         } 
  248.  
  249.       } 
  250.  
  251.     } 
  252.  
  253.   } 
  254.  
  255. } 
  256.  
  257. object(Node)#7 (2) { 
  258.  
  259.   ["data"]=> 
  260.  
  261.   string(0) "" 
  262.  
  263.   ["next"]=> 
  264.  
  265.   object(Node)#8 (2) { 
  266.  
  267.     ["data"]=> 
  268.  
  269.     int(7) 
  270.  
  271.     ["next"]=> 
  272.  
  273.     object(Node)#5 (2) { 
  274.  
  275.       ["data"]=> 
  276.  
  277.       int(4) 
  278.  
  279.       ["next"]=> 
  280.  
  281.       object(Node)#6 (2) { 
  282.  
  283.         ["data"]=> 
  284.  
  285.         int(5) 
  286.  
  287.         ["next"]=> 
  288.  
  289.         NULL 
  290.  
  291.       } 
  292.  
  293.     } 
  294.  
  295.   } 
  296.  
  297. } 
  298.  
  299. object(Node)#5 (2) { 
  300.  
  301.   ["data"]=> 
  302.  
  303.   int(4) 
  304.  
  305.   ["next"]=> 
  306.  
  307.   object(Node)#6 (2) { 
  308.  
  309.     ["data"]=> 
  310.  
  311.     int(5) 
  312.  
  313.     ["next"]=> 
  314.  
  315.     NULL 
  316.  
  317.   } 
  318.  
  319. }

Tags: PHP查找两个链表

分享到: