C++相交链表

Posted 久病成良医

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++相交链表相关的知识,希望对你有一定的参考价值。

给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null 。

思路

简单来说,就是求两个链表交点节点的 指针。 这里同学们要注意,交点不是数值相等,而是指针相等。

为了方便举例,假设节点元素数值相等,则节点指针相等。

看如下两个链表,目前curA指向链表A的头结点,curB指向链表B的头结点:

我们求出两个链表的长度,并求出两个链表长度的差值,然后让curA移动到,和curB 末尾对齐的位置,如图:

此时我们就可以比较curA和curB是否相同,如果不相同,同时向后移动curA和curB,如果遇到curA == curB,则找到焦点。

否则循环退出返回空指针。

/**
 * 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* curA=headA;
        ListNode* curB=headB;
        int lenA=0;
        int lenB=0;
        while(curA!=nullptr){  // 求链表A的长度
            lenA++;
            curA=curA->next;
        }
        while(curB!=nullptr){  // 求链表B的长度
            lenB++;
            curB=curB->next;
        }
        //现在的curA,curB已经指向最后一个节点了,需要重新指向头结点
        curA=headA;
        curB=headB; 

        if(lenA<lenB){  //假设链表A的长度大于链表B,否则交换
            swap(lenA,lenB);
            swap(curA,curB);
        }
        //gap是两个链表长度的差值
        int gap=lenA-lenB; // gap=lenA-lenB 错误,要有返回类型
        while(gap){     // 让curA和curB在同一起点上(末尾位置对齐)
            gap--;
            curA=curA->next;  
        }

        while(lenB){   // 遍历curA 和 curB,遇到相同则直接返回
            if(curA==curB)
                return curA; // return curA(val) 返回节点中的值,这个写法是错误的  直接return curA
            curA=curA->next;
            curB=curB->next;
            lenB--;
        } 
        return nullptr;  //没有交点则返回空
    }
};

以上是关于C++相交链表的主要内容,如果未能解决你的问题,请参考以下文章

C++相交链表

两个链表的第一个公共节点(Python and C++解法)

拿捏链表—— 相交链表

如何判断链表相交

回文链表;相交链表;合并两个有序链表(递归+迭代);

回文链表;相交链表;合并两个有序链表(递归+迭代);