力扣面试题 02.07. 链表相交
题目描述:
示例:
本题比较的是结点是否相同,不是结点内存储的值是否相同
法一:
思路:暴力遍历,选取其中一个链表为基准,使用两个while循环,比较结点是否相同。
代码如下:
class Solution {
public:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
ListNode *ptr = headA;
ListNode *cur = headB;
while(ptr != NULL){
while(cur != NULL){
if(cur == ptr){
return cur;
}
cur = cur->next;
}
cur = headB; //遍历一次链表B之后,要把cur重新变为B的头结点
ptr = ptr->next;
}
return NULL;
}
};
法二:
思路:
ptr指向A链表,cur指向B链表,以下默认A链表为长度较长的链表(如果B链表较长,可以使用swap函数,将A链表和B链表进行交换)
- 先计算两个链表的长度记为len(两个相交链表长度,比较长的那个链表在前len个结点处肯定没有相交的结点)
- 将指向比较长的链表头结点的指针移动len次(即指向A链表的指针移动了len次)
- ptr和cur指针同时移动,并且不断比较,如果存在指针相同则返回该指针,否则返回NULL
代码如下:
class Solution {
public:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
//计算两个链表的长度
ListNode *ptr = headA;
ListNode *cur = headB;
int lenA = 0 , lenB = 0;
while(ptr != NULL){
lenA++;
ptr = ptr->next;
}
while(cur != NULL){
lenB++;
cur = cur->next;
}
ptr = headA;
cur = headB;
//以lenA的长度为基准
if(lenB > lenA){
swap(lenA , lenB);
swap(ptr , cur);
}
int temp = lenA - lenB;
while(temp--){
ptr = ptr->next;
}
while(ptr != NULL){
if(ptr == cur){ //相交的结点
return ptr;
}
ptr = ptr->next; //同时移动
cur = cur->next;
}
return NULL;
}
};