题目描述:

  给定两个单链表的头节点head1和head2,如何判断两个链表是否相交?相交的话返回true,不想交的话返回false。

  给定两个链表的头结点head1head2。请返回一个bool值代表它们是否相交。

  链表中节点的类型设置如下:

class ListNode {
    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }
}

思路:

  1、首先判断是否有环,

  • 若两个链表都没有环,则进行无环单链表判断是否相交,进入2;
  • 若两个链表一个有环一个无环,则直接判断不相交;
  • 若两个链表都有环,则分别得到每个链表的入环节点node1,node2,然后进行有环单链表判断是否相交,进入3;

  判断是否有环的方法如下:

 1 /**
 2  * 判断链表是否有环
 3  * 判断方法是设置两个指针最初均指向头结点,然后fast每次走2步,slow每次走1步,
 4  * 如果链表没有环,则fast指针肯定先指向表尾的null
 5  * 如果有环,则fast和slow肯定会相遇。然后第一次相遇后我们将fast指针重新指向头结点,
 6  * 然后fast和slow每次都走一步直到第二次相遇,那么第二次相遇的节点即为入环的节点
 7  * @param head
 8  * @return 若有,则返回入环节点,否则,返回null
 9  */
10 public ListNode judgeRing(ListNode head){        
11     if(head == null){
12         return null ;
13     }
14     ListNode fast = head ;
15     ListNode slow = head ;
16     
17     while(fast != null && fast.next != null){
18         fast = fast.next.next ;
19         slow = slow.next ;
20         if(fast == slow){
21             fast = head ;
22             while(fast != slow){
23                 fast = fast.next ;
24                 slow = slow.next ;
25             }
26             return slow ;
27         }
28     }
29     return null ;
30 }
View Code

相关文章:

  • 2022-12-23
  • 2021-11-09
  • 2021-12-01
  • 2022-12-23
  • 2021-08-31
猜你喜欢
  • 2022-12-23
  • 2021-06-25
  • 2022-02-13
  • 2021-07-08
  • 2021-12-15
  • 2021-08-04
  • 2021-08-09
相关资源
相似解决方案