双指针C语言版(移位)
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {
struct ListNode* a = headA;
struct ListNode* b = headB;
int len_a = 0;
int len_b = 0;
while(a){
len_a++; //计算链表a的长度
a = a->next;
}
while(b){
len_b++; //计算链表b的长度
b = b->next;
}
a = headA;
b = headB;
int gap = abs(len_a-len_b); //求链表a和b的长度差的绝对值
if(len_a > len_b) //将链表a移动到与b末尾对齐的位置
while(gap--)
a = a->next;
else //将链表b移动到与a末尾对齐的位置
while(gap--)
b = b->next;
while(a){
if(a == b)
return a;
a = a->next;
b = b->next;
}
return NULL;
}
双指针C++版(a走完走b走的路,b走完走a走的路, 要么都为空 要么相遇)
/**
* 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* a = headA, *b = headB;
// 双指针分别遍历两个链表,若到尾停到另一个链表首
while (a != b) {
a = a == nullptr ? headB : a->next;
b = b == nullptr ? headA : b->next;
}
return a;
}
};
单指针全遍历(有点慢哦)
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {
struct ListNode *p=headB;
if(!headA)return NULL;
while(headA)//直到headA到尾部
{
if(!headB)return NULL;
while(p)//判断headB结点一个个比较是否和A是同一个地址
{
if(headA==p)
break;
p=p->next;//相同退出不同则继续比较下一个
}
if(headA==p)
break;
p=headB;
headA=headA->next;//后两句表示没有找到,比较写一个
}
return headA;//返回找到的结点
}