剑指 Offer II 023. 两个链表的第一个重合节点 - 力扣(LeetCode)
1.如果他们的有相同的节点,那么应该是从后向前数最后一个相同的节点是从前向后数第一个相同的节点,这个节点是要返回的节点;我们的求法是先计算两个链表的长度,然后让他们齐平,然后同时向后走,如果他们的地址相同,这就是需要返回的值,我们不需要担心如果永远没有相同的节点怎么办,因为他们会最终同时到达null,一定会相同
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {
//返回的是相同的节点
//先计算两个链表的长度
struct ListNode* cur1=headA;
int len1=0;
while(cur1)
{
len1++;
cur1=cur1->next;
}
struct ListNode* cur2=headB;
int len2=0;
while(cur2)
{
len2++;
cur2=cur2->next;
}
//将长的那个移动到等长的位置
if(len1<len2)
{
//移动len2
int n=abs(len2-len1);
while(n--)
{
headB=headB->next;
}
}
else
{
//移动len1
int n=abs(len2-len1);
while(n--)
{
headA=headA->next;
}
}
//开始同时移动,如果二者地址相同那么就是同一个节点
while(headA!=headB)
{
headA=headA->next;
headB=headB->next;
}
return headA;
}
这里还有一个需要注意的地方(我就是之前没有注意这里的问题)
abs()--;这种写法是不被允许的,因为计算的值计算机认为是一个常数,而自增自减的操作都是对于变量进行的操作,所以我们需要现将他赋值给变量