题目:
输入两个链表,找出它们的第一个公共节点。
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
错误代码
- 预设了链表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语句同时进行判断,无需考虑哪个链表更长 - 用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