力扣热题100 - 链表:相交链表

题目描述:

题号:160

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

图片

 

解题思路:

思路一:双指针遍历两遍

算法思路:

1、创建两个指针 A 和 B,初始时分别指向两个链表的头节点 headA 和 headB,然后将两个指针依次遍历两个链表的每个节点。每次操作需要同时更新指针 A 和 B。

2、如果指针 A 不为空,则将指针 A 移到下一个节点。同样如果指针 B 不为空,则将指针 B 移到下一个节点。

3、如果指针 A 为空,则将指针 A 移到链表 headB 的头节点;如果指针 B 为空,则将指针 B 移到链表 headA 的头节点。

若有相交,在两遍遍历的过程中,两指针会相遇。没有相交则它们会同时走到自己的末尾并等于NULL。(因为两遍遍历会使两指针都走过一样的路程)

时间复杂度:O(N)

空间复杂度:O(1)

C++


// C++
/**
 * 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) {
        if(headA == nullptr || headB == nullptr) {
            return nullptr;
        }
        ListNode *A = headA, *B = headB;
        while(A != B) {
            A = A == nullptr ? headB : A->next;
            B = B == nullptr ? headA : B->next;
        }
        return A;
    }
};

go

// go
/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
func getIntersectionNode(headA, headB *ListNode) *ListNode {
    if headA == nil || headB == nil {
        return nil
    }
    A, B := headA, headB
    for A != B {
        if A != nil {
            A = A.Next
        } else {
            A = headB
        }
        if B != nil {
            B = B.Next
        } else {
            B = headA
        }
    }
    return A
}

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值