Day2 两个链表的第一个公共结点【链表】

题目:
输入两个链表,找出它们的第一个公共节点。
leetcode原题链接

思路:
双指针,p1先遍历链表A,p2先遍历链表B
当p1遍历完时,回到链表B的头节点
当p2遍历完时,回到链表A的头节点
直到p1和p2相等,跳出while循环

注意:
“公共节点”—>同一节点—>内存地址相同。
所以while循环的判断条件是 节点的内存地址相同,而非节点的val相等。
如示例1,存在情况:链表A和链表B都有val为1的节点,但这是两个独立的内存地址不同的节点,并非公共节点
在这里插入图片描述

代码:
时间复杂度O(M+N)
空间复杂度O(1)

# 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:
        p1=headA
        p2=headB
        while p1 != p2:#节点相等,而非val相等
            if p1:
                p1=p1.next
            else:
                p1=headB
            if p2:
                p2=p2.next
            else:
                p2=headA
        return p1

简洁写法

# 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:
        p1,p2=headA,headB
        while p1 != p2:
            p1=p1.next if p1 else headB
            p2=p2.next if p2 else headA
        return p1

错误代码

  1. 预设了链表A比链表B短。
    -先让指针p1遍历链表A,直到遍历完链表A时,再让p1指向链表B的头节点,再对链表B的遍历情况进行判断。
    -但如果输入的链表B比链表A短,while p1下的p2=p2.next语句会报错Nonetype object has not attribute ‘next’,因为此时p1还未遍历完A链表,p2已经遍历完B链表且p2.next为None,None的类型是Nonetype没有next方法
    -正确代码中是已两个独立的if else语句同时进行判断,无需考虑哪个链表更长
  2. 用val相等作为公共节点的判定条件。
    -输入示例1时,输出为链表B中val为1的节点,而非真公共节点8
    在这里插入图片描述
# 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:
        p1=headA
        p2=headB
        while p1:
            p1=p1.next
            p2=p2.next
        p1=headB
        while p2:
            p1=p1.next
            p2=p2.next
        p2=headA
        while p1:
            if p1.val==p2.val:
                return p1
            p1=p1.next
            p2=p2.next
        return None

猜你喜欢

转载自blog.csdn.net/weixin_47128888/article/details/112478966