C++相交链表
Posted 久病成良医
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++相交链表相关的知识,希望对你有一定的参考价值。
给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null 。
思路
简单来说,就是求两个链表交点节点的 指针。 这里同学们要注意,交点不是数值相等,而是指针相等。
为了方便举例,假设节点元素数值相等,则节点指针相等。
看如下两个链表,目前curA指向链表A的头结点,curB指向链表B的头结点:
我们求出两个链表的长度,并求出两个链表长度的差值,然后让curA移动到,和curB 末尾对齐的位置,如图:
此时我们就可以比较curA和curB是否相同,如果不相同,同时向后移动curA和curB,如果遇到curA == curB,则找到焦点。
否则循环退出返回空指针。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
ListNode* curA=headA;
ListNode* curB=headB;
int lenA=0;
int lenB=0;
while(curA!=nullptr){ // 求链表A的长度
lenA++;
curA=curA->next;
}
while(curB!=nullptr){ // 求链表B的长度
lenB++;
curB=curB->next;
}
//现在的curA,curB已经指向最后一个节点了,需要重新指向头结点
curA=headA;
curB=headB;
if(lenA<lenB){ //假设链表A的长度大于链表B,否则交换
swap(lenA,lenB);
swap(curA,curB);
}
//gap是两个链表长度的差值
int gap=lenA-lenB; // gap=lenA-lenB 错误,要有返回类型
while(gap){ // 让curA和curB在同一起点上(末尾位置对齐)
gap--;
curA=curA->next;
}
while(lenB){ // 遍历curA 和 curB,遇到相同则直接返回
if(curA==curB)
return curA; // return curA(val) 返回节点中的值,这个写法是错误的 直接return curA
curA=curA->next;
curB=curB->next;
lenB--;
}
return nullptr; //没有交点则返回空
}
};
以上是关于C++相交链表的主要内容,如果未能解决你的问题,请参考以下文章