本文主要讲解相交链表的要点与细节
c++及java代码如下,末尾
1.两个链表相交的条件是,两个节点的指针相同,而不是元素值相同,即
if(a==b) return a;
2.·既然要找到相交的点,那么相交之后,两个链表就完全一样了(后续长度和数值),那么我们就要不断同步更新headA和headB的临时指针,直到满足相交条件。
a=a->next;
b=b->next;
3.但是由于两个链表的长度不一致,不能一上来就同步更新,他们原本存在长度差,导致相交点是不对齐的。所以我们需要先移动较长链表的临时指针,让他们尾部对齐,再开始同步更新。
4.小细节:由于不知道具体测试例中,两个链哪个是长的,所以要找一下长的。可以把长的交换给a链,省去后续分情况讨论
c++代码如下
class Solution {
public:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
ListNode* curA = headA;
ListNode* curB = headB;
int lenA = 0, lenB = 0;
while (curA != NULL) { // 求链表A的长度
lenA++;
curA = curA->next;
}
while (curB != NULL) { // 求链表B的长度
lenB++;
curB = curB->next;
}
curA = headA;
curB = headB;
// 让curA为最长链表的头,lenA为其长度
if (lenB > lenA) {
swap (lenA, lenB);
swap (curA, curB);
}
// 求长度差
int gap = lenA - lenB;
// 让curA和curB在同一起点上(末尾位置对齐)
while (gap--) {
curA = curA->next;
}
// 遍历curA 和 curB,遇到相同则直接返回
while (curA != NULL) {
if (curA == curB) {
return curA;
}
curA = curA->next;
curB = curB->next;
}
return NULL;
}
};
java代码如下
class Solution {
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
if (headA == null || headB == null) return null;
ListNode a = headA;
ListNode b = headB;
int a_n = 0;
int b_n = 0;
//计算a链长度
while (a != null) {
a_n++;
a = a.next;
}
//计算b链长度
while (b != null) {
b_n++;
b = b.next;
}
a = headA;
b = headB;
//如果a是短链,那么把b交换给a
if (a_n < b_n) {
//1. swap (lenA, lenB);
int tmpLen = a_n;
a_n = b_n;
b_n = tmpLen;
//2. swap (curA, curB);
ListNode tmpNode = a;
a = b;
b = tmpNode;
}
//长度差
int diff = a_n - b_n;
//移动a到对应位置
while (diff != 0 && a != null) {
a = a.next;
diff--;
}
//判断是否相交
while (a != null) {
if (a == b) return a;
a = a.next;
b = b.next;
}
return null;
}
}
标签:ListNode,相交,next,链表,curB,headB,curA,leetcode160
From: https://blog.csdn.net/lxw6666666666/article/details/139520967