160. 相交链表

image.png

思路

双指针 想办法使得尾部对齐,然后就可以同步往后 如果出现俩个节点一致就是交点 如果最后都到了空 说明没交点

实现

# 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,B = headA,headB
        a_len,b_len=0,0
        while(A):
            A=A.next
            a_len+=1
        while(B):
            B=B.next
            b_len+=1
        diff = abs(a_len-b_len)
        for i in range(diff):
            headA=headA.next if a_len>b_len else headA
            headB=headB.next if b_len>a_len else headB
        while(headA and headB): # 对齐完第一个节点可能就相交了
            if headA==headB:
                return headA
            headA=headA.next
            headB=headB.next
        return None

优化

能不能不去遍历两遍链表,而是在同一个循环中解决问题呢?
可以! 当指针跑到末尾之后时,我们让它等于另一个链表的头,为什么这是可行的?因为当一个指针走到末尾时,说明这个指针走过了这整个链表的长度,我们考虑原来走长链的指针,它到末尾时,短指针肯定已经重定位过了,此时短指针也走了长链表的长度,然后长指针被定位到短链表上,此时,恰好形成末尾对齐的情况,直接遍历即可,遇到相等的节点返回就好了。

# 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,B=headA,headB
        while(A!=B):
            A=A.next if A else headB
            B=B.next if B else headA
        return A
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 160. 相交链表 编写一个程序,找到两个单链表相交的起始节点。 示例 1: 输入:intersectVal = ...
    TheKey_阅读 296评论 0 1
  • 编写一个程序,找到两个单链表相交的起始节点。 如下面的两个链表: 在节点 c1 开始相交。 示例 1: 输入:in...
    薄荷糖的味道_fb40阅读 207评论 0 0
  • 编写一个程序,找到两个单链表相交的起始节点。如下面的两个链表:image.png在节点 c1 开始相交。示例 1:...
    genggejianyi阅读 130评论 0 0
  • 160. 相交链表 题目 编写一个程序,找到两个单链表相交的起始节点。 如下面的两个链表: 在节点 c1 开始相交...
    逍遥白亦阅读 186评论 0 1
  • 推荐指数: 6.0 书籍主旨关键词:特权、焦点、注意力、语言联想、情景联想 观点: 1.统计学现在叫数据分析,社会...
    Jenaral阅读 5,746评论 0 5