题目描述:
编写一个程序,找到两个单链表相交的起始节点。
注意:
- 如果两个链表没有交点,返回 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