160.相交链表

难度:简单
题目描述:
在这里插入图片描述
思路总结:想出思路就已经很不容易了,实现起来要考虑的细节又太多,边界特殊情况等等。太南了。
思路一,存哈希表法,这种想法比较直观,但是不满足题目的空间要求,并且会超出时间限制;
思路二,双指针法,用到的一种思路是起点不一样,路程一样,速度一样,必定同时到达!因此必定同时走过最后相交的部分。A+B=B+A。这种思路,虽然想通了会感觉很清晰,但是实现起来却没有那么容易。
这个简单题不简单
题解一:(哈希表法)

# 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:
        #思路:遍历一遍A,将其中的每个节点对象存到list中,然后遍历B,返回第一次在list中的结点val
        cur = headA
        ls = []
        while cur:
            ls.append(cur)
            cur = cur.next
        cur = headB
        while cur and cur not in ls:
            cur = cur.next
        return cur

题解一结果:
在这里插入图片描述
题解二:(双指针法)
这种解法的实现思路很多,我会在下面给出一个最简洁的写法。这里先介绍一下一个一般思路方法。
这里做的就是先让curA和curB指针往后各走一步,然后判断两者是否同时为空,这点很重要,如果不判断,会陷入死循环中。死循环的原因就是后面的两个if语句。if语句,就是判断如果curA或者curB为空,那么就让其从另一个链表头开始。即A+B=B+A的后半程。
从上面解法也可以看出来,其实我们每次只想让curA或者curB走一步,因此用一个三目运算符就可以做到。不过这种方法耗时更长了,也许是因为需不需要换头都要判断的原因。

class Solution:
    def getIntersectionNode(self, headA: ListNode, headB: ListNode) -> ListNode:
        #思路:双指针遍历A+B=B+A,两指针必定同时到达相交的部分
        if not headA or not headB:
            return None
        curA = headA
        curB = headB
        while curA != curB:
            curA = curA.next
            curB = curB.next
            # if not curA and not curB:
            #     return None
            if not curA:
                curA = headB
            if not curB:
                curB = headA
        return curA
        
class Solution:
    def getIntersectionNode(self, headA: ListNode, headB: ListNode) -> ListNode:
        #简化版
        if not headA or not headB:
            return None
        curA = headA
        curB = headB
        while curA != curB:
            curA = curA.next if curA else headB
            curB = curB.next if curB else headA
        return curA

题解二结果:(上二,下一)
在这里插入图片描述

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值