#160.相交链表

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

注意:

  • 如果两个链表没有交点,返回 null.
  • 在返回结果后,两个链表仍须保持原有的结构。
  • 可假定整个链表结构中没有循环。
  • 程序尽量满足 O(n) 时间复杂度,且仅用 O(1) 内存

知识点:

思路和代码:
方法一: 暴力法
对链表A中的每一个结点 a_i,遍历整个链表 B 并检查链表 B 中是否存在结点和 a_i相同。
复杂度分析
时间复杂度 : O(mn)
空间复杂度 : O(1)
方法二: 哈希表法
遍历链表 A 并将每个结点的地址/引用存储在哈希表中。
然后检查链表 B 中的每一个结点 b_i是否在哈希表中。
若在,则 b_i为相交结点。
复杂度分析
时间复杂度 : O(m+n)
空间复杂度 : O(m) 或 O(n)

def internode1(head1,head2):
    hash_dict = dict()
    inter = None
    while head1:
        hash_dict[head1] = head1.val
        head1= head1.next
    while head2:
        if head2 in hash_dict:
            inter = head2.val
            break
        else:
            head2 = head2.next
    return inter

方法三:双指针法
创建两个指针pA和pB,分别初始化为链表A和B的头结点。然后让它们向后逐结点遍历。
当pA到达链表的尾部时,将它重定位到链表B的头结点;
类似的,当pB到达链表的尾部时,将它重定位到链表A的头结点。
若在某一时刻pA和pB相遇,则pA/pB为相交结点。
若无相交结点,则最终退出时pA和pB均为None

# Definition for singly-linked list.
# class ListNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution(object):
    def getIntersectionNode(self, headA, headB):
        """
        :type head1, head1: ListNode
        :rtype: ListNode
        """
        if not headA or not headB:
            return None
        a,b = headA,headB
        while a is not b:
            a = a.next if a else headB
            b = b.next if b else headA
        return a
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值