题目:
click here!!题目传送门
思路:
1.笨方法
因为如果两个链表相交的话,从相交的地方往后是同一条链表,所以:
分别遍历两个链表,得出两个链表的长度,两个长度做差得到n,然后将长的链表头指针先移动n个结点,然后两个链表再同时移动,如果出现两个链表的指针直到同一个内存地址,说明相交,没有出现指向同一个内存地址的情况就是不相交
class Solution { public ListNode getIntersectionNode(ListNode headA, ListNode headB) { int lenA = 0,lenB = 0, len = 0; ListNode tA = headA; ListNode tB = headB; while(tA != null){ lenA++; tA = tA.next; } while(tB != null){ lenB++; tB = tB.next; } len = Math.max(lenA,lenB) - Math.min(lenA,lenB); if(lenA > lenB){ lenA = 0; while (lenA < len){ headA = headA.next; lenA++; } }else{ lenB = 0; while (lenB < len){ headB = headB.next; lenB++; } } while (headA != headB){ headA = headA.next; headB = headB.next; if(headA == null || headB==null) return null; } return headA; } }
2 巧方法
和方法1中一样首先将两个链表的指针之间的长度差消除,这里可以这样来做:
两个链表的指针同时向后移动,在链表A指针移动到表尾的时候令指针指向链表B;链表B指针移动到表尾的时候令指针指向链表A的表头。如果两个链表相交的话,则在较长的链表的指针转向较短链表表头的时候,较短链表的指针已经在长链表上走过两链表的长度差n个节点了,也就是说,现在两个指针处于同一起跑线上。(对着原题目的图走一遍就明白了)
长链表的指针从长链表起步就多走了n个节点,转到短链表上又少走了n个;短链表的指针从短链表起步就少走了n个节点,转到长链表上时,有多走了n个节点,所以两者会同时处于同一起跑线上。
class Solution { public ListNode getIntersectionNode(ListNode headA, ListNode headB) { if(headA==null || headB==null) return null; ListNode pA = headA, pB = headB; while (pA != pB){ pA = pA==null ? headB : pA.next; pB = pB==null ? headA : pB.next; } return pA; } }