力扣面试题 02.07. 链表相交

力扣面试题 02.07. 链表相交

题目描述:

力扣面试题 02.07. 链表相交_第1张图片

示例:

力扣面试题 02.07. 链表相交_第2张图片
本题比较的是结点是否相同,不是结点内存储的值是否相同

法一:

思路:暴力遍历,选取其中一个链表为基准,使用两个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链表进行交换)

  1. 先计算两个链表的长度记为len(两个相交链表长度,比较长的那个链表在前len个结点处肯定没有相交的结点)
  2. 将指向比较长的链表头结点的指针移动len次(即指向A链表的指针移动了len次)
  3. 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;
    }
};

你可能感兴趣的:(力扣,链表,leetcode,算法,c++,数据结构)