Leetcode 刷题(7)简单单链表:确认相交链表

题目:

160. 相交链表

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
难度:简单
题目分析:如果没有存储空间限制,可以把其中一个链表存到集合 set() 里面,然后再遍历另一个链表,看是否有节点在集合里面。

巧妙点的方法是使用两个指针。 如果两个链表有相交,那么后面的整个部分,长度是相同的,所以,如果能消除不相交的部分的长度差,那它们之后肯定可以同时到相交点。方法很简单,每个指针都走一遍两个链表!

方法一:使用额外空间

# 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) -> ListNode:
    if not headA or not headB:
    	return None
    
    visited = set()
    pA = headA
    while pA:
    	visited.add(pA)
    	pA = pA.next
    pB = headB
    while pB:
    	if pB in visited:
    		return pB
    	pB = pB.next
    return pB

运行效果:

在这里插入图片描述
在这里插入图片描述

方法二:使用双指针

# 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) -> ListNode:
    if not headA or not headB:
    	return None
	
	p1 = headA
	p2 = headB
	while p1 != p2:
		if p1 is not None:
			p1 = p1.next
		else:
			p1 = headB
		
		if p2 is not None:
			p2 = p2.next
		else:
			p2 = headA
	
	return p1  # 如果没有相遇,两个指针会同时到达尾结点

运行结果:

在这里插入图片描述
在这里插入图片描述

小结:

这类题目,使用了额外空间,其实也多不到哪去……

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值