leetcode---------------相交链表

题目:

编写一个程序,找到两个单链表相交的起始节点。

如下面的两个链表

在节点 c1 开始相交。

这一题之前听左神视频课讲过,

最暴力的方法就是用hash表,将A存入hash表,然后遍历B挨个检查,这样的时间复杂度为O(m+n);空间复杂度为O(m) or O(n)

然后就是利用双指针法,因为如果两个链表相交,说明后面一段链表长度肯定是相同的,那么只要去除长度差,从相同长度的节点开始遍历,那么每一次进行比较节点是否相同,最终要么找到相同的相交节点,要么都遍历到空为止;

因此时间复杂度为O(m+n);空间复杂度为O(1);

class Solution {
public:
    ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
        if(!headA||!headB)    return NULL;
        ListNode *nodeA=headA;
        ListNode *nodeB=headB;
        int sizeA=0;
        int sizeB=0;
        while(true)
        {
            if(nodeA->next)   nodeA=nodeA->next;
            else break;
            ++sizeA;
        }
        while(true)
        {
            if(nodeB->next)   nodeB=nodeB->next;
            else break;
            ++sizeB;
        }
        if(nodeA==nodeB){
            if(sizeA>sizeB){
                sizeA=sizeA-sizeB;
                while(sizeA--)
                {
                    headA=headA->next;
                }
            }
            else{
                sizeA=sizeB-sizeA;
                while(sizeA--)
                {
                    headB=headB->next;
                }
            }
            while(true){
                    if(headA==headB)    return headA;
                    headA=headA->next;
                    headB=headB->next;
                }
        }
        else return NULL;

    }
};

还有一种巧妙的解法是:将两个链表都拼接起来,在A的链表后面接上B;在B的链表后面接上A,这样大家长度一样,就直接从头节点开始遍历,然后,到最后末尾处,如果相交,后面肯定是一样的,否则返回NULL;

(盗用https://leetcode-cn.com/problems/intersection-of-two-linked-lists/solution/intersection-of-two-linked-lists-shuang-zhi-zhen-l/的图)

 class Solution {
public:
 ListNode* getIntersectionNode(ListNode* headA, ListNode* headB) {
        ListNode *ha = headA, *hb = headB;
        while (ha != hb) {
            ha = ha != null ? ha->next : headB;
            hb = hb != null ? hb->next : headA;
        }
        return ha;
    }
}

时间复杂度为O(m+n);空间复杂度为O(1)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值