题目描述:
给定两个单链表的头节点head1和head2,如何判断两个链表是否相交?相交的话返回true,不想交的话返回false。
给定两个链表的头结点head1和head2。请返回一个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 }