边练习边更新,加油!!!
题目:
给你两个单链表的头节点 headA
和 headB
,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null
。
图示两个链表在节点 c1
开始相交:
题目数据 保证 整个链式结构中不存在环。
注意,函数返回结果后,链表必须 保持其原始结构
注意点:
- 用集合储存,减少遍历时间和判断时间(集合里的元素只能唯一,在这里不影响)
- 将b指针直接代入集合搜索,减少储存
- c++的null是python的None
- 进阶:设计一个时间复杂度
O(m + n)
、仅用O(1)
内存的解决方案
标准做法:
双指针:相交长度c,不相交长度a/b
相交:走a+c+b会指向同一个
不相交:走a+c+b+c会指向None
注意:链表长度为0的情况
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def getIntersectionNode(
self, headA: ListNode, headB: ListNode
) -> Optional[ListNode]:
cur1, cur2 = headA, headB
while cur1 or cur2:
if cur1 == cur2:
return cur1
cur1 = cur1.next if cur1 else headB
cur2 = cur2.next if cur2 else headA
return
作者:RainForest
链接:https://leetcode.cn/problems/intersection-of-two-linked-lists/solutions/3593376/dui-cheng-shou-wei-lian-jie-by-gcsyymm-u2kp/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
奇怪的做法:
来自评论区:A走一遍把值取str,B走一遍发现第一个字符串就是相交点,最后再把A的值改回来
自己的做法:【看题解后仍未通过时间】
看了一下题解,搜索b链表的结点在a集合里是否存在,当a存储为列表时,超时
# 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
"""
end = headA
lA = {headA}
while end:
end = end.next
lA.add(end)
while headB:
if headB in lA: # 不存B直接判断
break
else:
headB = headB.next
return headB
1.超时:储存两个链表(也不要想得太简单和理所当然吧)
时间复杂度n2
# 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
"""
end = headA
lA = [headA]
while end:
end = end.next
lA.append(end)
end = headB
lB = [headB]
while end:
end = end.next
lB.append(end)
for node in lA:
if node in lB:
break
if node == None:
return null
return node