题目
解题思路
此题之前写过一次,用的是一个非常浪漫的做法“我走过你来时的路,则我们一定会相遇”,核心思想就是两个链表的指针即走自己的链表,同时也走对方的链表,如果两个链表是相交的,那么两个指针一定会走到一起,从而完成判断。但这次用一个比较好理解和实现的方法(时间复杂度会高一点,空间复杂度不变),思想如下:
- 首先算出两个链表的长度,并求出两个链表之间长度的差值。
- 长的链的指针偏移两个链表长度差值的距离,将两个链表拉到同一个起跑线上去,然后同时开始遍历,如果两个指针指向同一个元素,证明链表相交。反之不相交,返回null即可。
代码
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
public class Solution {
public ListNode changeNode(int step, ListNode head){
for(int i = 0; i < step; i++){
head = head.next;
}
return head;
}
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
if(headA == null || headB == null) return null;
ListNode up = headA;
ListNode down = headB;
ListNode len1_p = up;
ListNode len2_p = down;
int len1 = 0;
int len2 = 0;
while(len1_p != null){
len1_p = len1_p.next;
len1++;
}
while(len2_p != null){
len2_p = len2_p.next;
len2++;
}
// int cha = len1 > len2 ? len1 - len2 :len2 - len1;
if(len1 > len2){
up = changeNode(len1 - len2 , up);
}
else{
down = changeNode(len2 - len1 , down );
}
while(up != null && down != null){
if(up == down) return up;
up = up.next;
down = down.next;
}
return null;
}
}