链表相交问题

1,如果两个单链表相交,输出相交节点

 

 

让 两个链表先处于同一起跑线,如图所示,然后再  同时向后遍历(从d和h开始同时向后遍历),那么就可以确定是在哪个地方相交的了(确定了在f处相同,即交点)。
那么如何让他俩处于同一起跑线呢?
很简单,只需要长的链表先走    走到与短的链表一样长就可以了。
所以解法:1,分别计算两个链表的长度,得出差值(长的为7,短的为4,差值3)
                  2,让长的链表先走   差值  步,此时两个链表长度相同(长的从d开始,短的从h开始)
                  3,同时遍历两个链表,当相同时,即找到了交点。(遍历到f时相等,即交点)
 
我的代码实现参考(思路,可能并不严谨)
 1 //两链表相交问题
 2 class T18{
 3     public static class Node{
 4         private int value;
 5         private Node next;
 6         public Node(int value){
 7             this.value=value;
 8         }
 9     }
10     public static Node getNode(Node node1,Node node2){
11         int node1_len = getLen(node1);  //获得两个链表的长度
12         int node2_len = getLen(node2);
13         Node longLink=node1_len>node2_len?node1:node2;  //确定那个是长的
14         Node shortLink=node1_len<node2_len?node1:node2;
15         int cha=Math.abs(node1_len-node2_len);  //得到长度的差值
16         for (int i = 0; i < cha; i++) {  //将长的的起点走到与短的相同
17             longLink=longLink.next;
18         }
19         while(longLink.value!=shortLink.value){  //知道两个结点相交
20             longLink=longLink.next;
21             shortLink=shortLink.next;
22         }
23         return longLink;
24     }
25     public static int getLen(Node head){
26         int length=0;
27         while(head!=null){
28             head=head.next;
29             length++;
30         }
31         return length;
32     }
33 }

2,一个链表成环问题

 

解决这个问题的第一步是:如何确定一个链表中包含环。我们可以用两个指针来解决这个问题。和前面的问题一样,定义两个指针,同时从链表的头节点出发,第一个指针一次走一步,第二个指针一次走两步。如果走得快得指针追上了走得慢的指针,那么链表就包含环;如果走得快得指针走到了链表得末尾都没有追上第一个指针,那么链表就不包含环。
第二步是:如何找到环的入口。我们还是可以用两个指针来解决这个问题。先定义两个指针P1和P2指向链表的头节点。如果链表中的环有n个节点,则指针P1先在链表上向前移动n步,然后两个指针以相同的速度向前移动。当第二个指针指向环的入口节点时,第一个指针已经围绕着走了一圈,又回到了入口节点,交汇处便是环的入口节点。
我的代码实现:
 1 //单向链表相交问题:找出环的入口结点
 2 class Find{
 3     public static class Node{
 4         private int value;
 5         private Node next;
 6 
 7         public Node(int value) {
 8             this.value = value;
 9         }
10     }
11 
12     public Node judge(Node head){
13         Node n1=head;
14         Node n2=head;
15         while(n1!=null&&n2!=null){
16             n1=n1.next;
17             n2=n2.next.next;
18             if(n1==n2){
19                 return n1;
20             }
21         }
22         return null;
23     }
24     public Node find(Node head){
25         int lengh=0;
26         Node judge = judge(head);
27         if(judge==null){
28             return null;
29         }
30         Node temp1=judge;
31         //得到环中结点的个数
32         while(judge.next!=temp1){
33             lengh++;
34         }
35         Node p1=head;
36         for (int i = 0; i <lengh ; i++) {
37             p1=p1.next;
38         }
39         Node p2=head;
40         while(p1!=p2){
41             p1=p1.next;
42             p2=p2.next;
43         }
44         return p1;
45     }
46 }

 

posted @ 2020-05-01 11:09  codeFlyer  阅读(384)  评论(0编辑  收藏  举报