思路:
1、定义两个节点指针,分别指向两个单链表的头节点;
2、若两个单链表有一个长度为空,则判断结果为 无焦点;
3、通过while循环分别得到两个单链表的长度;
4、通过比较和交换使得较长的单链表为A,较短的单链表为B,并得到长度差值gap;
5、因为在判断链表长度的缘故,此时两个指针curA和curB已经分别指向链表末尾;
6、重新定义使得两个指针分别指向单链表的头节点;
7、通过循环使得链表a的指针指向和链表b的指针长度相同的位置;
8、逐个比较两个链表的指针所指的数值,相等返回指针的值;反之返回空。
#include <iostream>
using namespace std;
struct ListNode
{
int value;
ListNode* next;
ListNode(int x) :value(x), next(NULL) {}
};
int jiaodian(ListNode* a1,ListNode* b1)
{
ListNode* curA = a1;//定义一个节点指针指向链表a的头节点
ListNode* curB = b1;//定义一个节点指针指向链表b的头节点
int lenA = 0;//链表a的初始长度
int lenB = 0;//链表b的初始长度
if (a1 == NULL || b1 == NULL)//若有任一链表为空表示没有节点
{
return NULL;
}
while (curA!=NULL)//通过while循环求取链表a的长度
{
lenA++;
curA = curA->next;
}
while (curB != NULL)//通过while循环求取链表b的长度
{
lenB++;
curB = curB->next;
}
curA = a1;//求取长度指针错位,重新使得curA指向链表A的头节点
curB = b1;//使得curB指向链表B的头节点
if (lenB > lenA)//通过比较两个链表的长度,使得较长的链表为a,较短的链表为b
{
swap(lenA, lenB);
swap(curA, curB);
}
int gap = lenA - lenB;//求取两个链表的长度差值
while (gap--)//将两个链表的尾节点放在在一起,通过循环使得curA指向的位置和链表B的curB指向的长度相同的位置
{
curA = curA->next;
}
while (curA!= NULL)
{
if (curA == curB)
{
return curA->value;
}
curA = curA->next;
curB = curB->next;
}
return NULL;
}
int main()
{
//单链表1
ListNode* a1 = new ListNode(2);
ListNode* a2 = new ListNode(3);
ListNode* a3 = new ListNode(4);
ListNode* a4 = new ListNode(5);
ListNode* a5= new ListNode(6);
ListNode* a6 = new ListNode(7);
a1->next = a2;
a2->next = a3;
a3->next = a4;
a4->next = a5;
a5->next = a6;
a6->next = NULL;
//单链表2
ListNode* b1 = new ListNode(2);
ListNode* b2 = new ListNode(3);
ListNode* b3 = new ListNode(4);
//ListNode* b4 = new ListNode(5);
b1->next = b2;
b2->next = b3;
b3->next = a5;
cout<<jiaodian(a1, b1);
system("pause");
return 0;
}