题目链接:https://leetcode.cn/problems/intersection-of-two-linked-lists/
算法思想
- 分别计算出两个链表的长度
- 由于链表重合部分的长度一定是相等的,因此需要让更长的链表先向前两链表长度之差步,以达到从同一起跑线开始比较的目的
- 之后依次比较两链表节点,相等时的结点即为重合节点
- 注:重合节点≠值相等的节点
- 上图中两节点均有节点值为1的结点,但该结点不是重合节点,因为它们在内存中指向两个不同的位置,因此判断条件为判断两个节点是否相等
headA==headB
,而不是headA->val==headB->val
算法代码
/**
* 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) {
int num1=0,num2=0;
ListNode* p;
p=headA;
ListNode* q;
q=headB;
ListNode* Intersected;
while(p!=NULL){
p=p->next;
num1++;
}
while(q!=NULL){
q=q->next;
num2++;
}
if(num1>num2){
int num=num1-num2;
while(num!=0){
headA=headA->next;
num--;
}
}else{
int num=num2-num1;
while(num!=0){
headB=headB->next;
num--;
}
}
while(headA!=headB&&headA!=NULL){
headA=headA->next;
headB=headB->next;
}
Intersected=headA;
return Intersected;
}
};