题目链接:
题目描述:
给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。
题目分析:
1.相交是指A的节点地址 = B的节点地址
2.如果两个链表不一样长,长的链表应该先走差值步,到和短的链表一样长的时候,两个链表再边走边比较。
思路描述:
1.先确定两个链表,谁长谁短
2.长的链表先走差值步
3.判断A是否等于B节点
运行代码:
/**
* 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) {
ListNode pl = headA;
ListNode ps = headB;
//计算两个链表长度
int lenA =0;
while(pl != null){
lenA++;
pl = pl.next;
}
int lenB =0;
while(ps != null){
lenB++;
ps = ps.next;
}
//此时pl,ps都为null,需要手动指回head
pl = headA;
ps = headB;
//差值步
int len = lenA-lenB;
if(len < 0){
pl = headB;
ps = headA;
len = lenB - lenA;//把len变成正数
}
//pl永远指向最长的链表,ps指向最短的链表
while(len != 0){
pl = pl.next;
len-- ;
}
while(pl !=null && ps != null && pl != ps){
pl = pl.next;
ps = ps.next;
}
if(pl == ps && pl != null ){
return pl;
}
return null;
}
}