https://leetcode.com/problems/intersection-of-two-linked-lists/
解题思路:
方法一利用两个表长度的差值,让长的链表先走,直到两个链表长度相等。接着两个表都一步一步走,如果碰头就 return。
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
public class Solution {
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
if(headA == null || headB == null)
return null;
int l1 = 0, l2 = 0;
ListNode p1 = headA;
ListNode p2 = headB;
while(p1 != null) {
l1++;
p1 = p1.next;
}
while(p2 != null) {
l2++;
p2 = p2.next;
}
p1 = headA; p2 = headB;
while(l1 < l2) {
p2 = p2.next;
l2--;
}
while(l1 > l2) {
p1 = p1.next;
l1--;
}
while(p1 != p2) {
p1 = p1.next;
p2 = p2.next;
}
return p1;
}
}
方法二是两个链表先同时走,走完了自己的长度接着指向对方的表头,这样循环着走。
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
public class Solution {
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
if(headA == null || headB == null)
return null;
ListNode p1 = headA, p2 = headB;
while(p1 != null && p2 != null && p1 != p2) {
p1 = p1.next;
p2 = p2.next;
if(p1 == null && p2 == null)
return null;
if(p1 == null)
p1 = headB;
if(p2 == null)
p2 = headA;
}
return p1;
}
}