题目链接https://leetcode-cn.com/explore/interview/card/top-interview-quesitons-in-2018/265/linked-list/1148/
第一次在web上写代码只出现一点语法错误,然后修改一下提交通过,以下是自己的算法:
/**
* 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) {
if(!headA||!headB) return NULL;
int a_l = get_long(headA);
int b_l = get_long(headB);
int n=0;
if(a_l>b_l){
n = a_l-b_l;
while(n){
headA = headA->next;
n--;
}
}else{
n = b_l-a_l;
while(n){
headB = headB->next;
n--;
}
}
while(headA!=headB){
headA = headA->next;
headB = headB->next;
}
return headA;
}
int get_long(ListNode *head){
int n=0;
while(head){
head = head->next;
n++;
}
return n;
}
};
以下是大神的算法:
/**
* 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) {
if(headA == NULL || headB == NULL) return NULL;
//定义两个指针,一个指向A的头,一个指向B的头
//两个指针同时向后走,到末尾之后就转向另一个链表的头节点
//这样就使得相遇节点之前两个指针的路径相同,如果没有交点,那么末尾的null就是他们相同的点
ListNode* pA = headA;
ListNode* pB = headB;
while(pA != pB) {
pA = pA == NULL ? headB : pA->next;
pB = pB == NULL ? headA : pB->next;
}
return pA;
}
};
理解: