leetcode.02.07链表相交

一、题目

 

  这个题目目标太冗余了,其实我们要做就是返回相交的节点指针

二、分析

 参考的方法,主要是确定两个链表对齐位置,逐个向后面比较,返回相等的指针即可

三、参考代码

一种比较简洁的解法:

/**
 * 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* pre_1 = headA;
        ListNode* pre_2 = headB;
        while(pre_1!=pre_2){
            pre_1 = (pre_1 == NULL? headB : pre_1->next);
            pre_2 = pre_2 == NULL? headA : pre_2->next;
        }
        return pre_1;
    }
};

一种符合思维的代码(代码随想录)

class Solution {
public:
    ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
        ListNode* curA = headA;
        ListNode* curB = headB;
        int lenA = 0, lenB = 0;
        while (curA != NULL) { // 求链表A的长度
            lenA++;
            curA = curA->next;
        }
        while (curB != NULL) { // 求链表B的长度
            lenB++;
            curB = curB->next;
        }
        curA = headA;
        curB = headB;
        // 让curA为最长链表的头,lenA为其长度
        if (lenB > lenA) {
            swap (lenA, lenB);
            swap (curA, curB);
        }
        // 求长度差
        int gap = lenA - lenB;
        // 让curA和curB在同一起点上(末尾位置对齐)
        while (gap--) {
            curA = curA->next;
        }
        // 遍历curA 和 curB,遇到相同则直接返回
        while (curA != NULL) {
            if (curA == curB) {
                return curA;
            }
            curA = curA->next;
            curB = curB->next;
        }
        return NULL;
    }
};

 

posted @ 2021-11-11 16:38  星光夜  阅读(23)  评论(0)    收藏  举报