本篇主要是在学习链表数据结构中时,两个链表相交时如何找到相交时的起始节点时所一步一步执行的操作。
题目来源于力扣面试题02.07.链表相交。
根据题意,我们的操作分为如下几步:
(1)分别求出两个链表的长度
(2)初始时,定义两个不同的cur指针分别指向两个链表的头节点
(3)根据两个链表的长度差,使得长链表的cur指针移动到短链表初始时的cur指针对齐的位置
(4)同时移动两cur指针,循环判断两指针是否相等
public class Solution {
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
//定义单链表,初始化其长度
ListNode curA=headA;
ListNode curB=headB;
int lenA=0;
int lenB=0;
//计算链表A的长度
while(curA != null){
curA=curA.next;
lenA++;
}
//计算链表B的长度
while(curB != null){
curB=curB.next;
lenB++;
}
//将cur指针重新定位到头节点head处
curA=headA;
curB=headB;
//统一把链表A设为两个链表中较长的那个
if(lenB>lenA){
//先交换链表长度
int tmplen=lenA;
lenA=lenB;
lenB=tmplen;
//再交换链表头节点
ListNode tmpnode=curA;
curA=curB;
curB=tmpnode;
}
//移动长链表A的cur指针到短链表B的cur指针对齐的位置
int val=lenA-lenB;
while(val-- > 0){
curA=curA.next;
}
//从对齐位置开始,curA和curB同时向后移动直到指针相等的位置
while(curA!=null){
if(curA==curB){
//指针相等返回其中任意一个
return curA;
}
curA=curA.next;
curB=curB.next;
}
//找不到交点,返回null
return null;
}
}
这里注意求两个
链表交点
节点的指针,交点不是数值相等,而是指针相等