【数据结构与算法】链表-leetcode160.相交链表

链接
题目:
给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。

图示两个链表在节点 c1 开始相交:
在这里插入图片描述

解题:
利用两个指针,分别往下遍历,如果当前指针为空,则指向对方的头节点。利用路径总和相等,便可以找到交点。 为什么要这样判断,因为你要保证没有相交时,他们的共同指针是空指针,跳出循环,否则无限循环

指针A :a+c+b ;
指针B :b+c+a ;
明显 a+c+b = b+c+a;
因而如果两个链表相交,则指针A和指针B必定在相交结点相遇。

时间复杂度为o(m+n),空间复杂度为o(1)
在这里插入图片描述

ListNode* getIntersectionNode(ListNode* headA, ListNode* headB) {
    if (headA == nullptr || headB == nullptr)return nullptr;
    ListNode* left = headA;
    ListNode* right = headB;
 
    while (left != right) {
        if (left) {
            left = left->next;

        }
        else if (left == nullptr) {
            left = headB;
        };
        if (right) {
            right = right->next;
        }
        else if (right == nullptr) {
            right = headA;
        };
        if (left) {
            cout << "left:" << left->val << endl;

        }
        else {
            cout << "left: None" << endl;

        }
        if (right) {
            cout << "right:" << right->val << endl;

        }
        else {
            cout << "right: None" << endl;

        }
    }
    

    return left;
}
#include<iostream>
#include<vector>
using namespace std;
struct ListNode
{
	int val;
	ListNode* next;
	ListNode(int val):val(val),next(nullptr){}
};
ListNode* getIntersectionNode(ListNode* headA, ListNode* headB) {
    if (headA == nullptr || headB == nullptr) {
        return nullptr;
    }
    ListNode* pA = headA, * pB = headB;
    while (pA != pB) {
        pA = pA == nullptr ? headB : pA->next;
        pB = pB == nullptr ? headA : pB->next;
    }
    return pA;
}

int main() {
    ListNode* headA = new ListNode(5);
    headA->next = new ListNode(3);
    headA->next->next = new ListNode(8);
    ListNode* headB = new ListNode(2);
    headB->next = headA->next->next;
    cout << getIntersectionNode(headA, headB)->val << endl;;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值