难度:简单
题目描述:
思路总结:想出思路就已经很不容易了,实现起来要考虑的细节又太多,边界特殊情况等等。太南了。
思路一,存哈希表法,这种想法比较直观,但是不满足题目的空间要求,并且会超出时间限制;
思路二,双指针法,用到的一种思路是起点不一样,路程一样,速度一样,必定同时到达!因此必定同时走过最后相交的部分。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