- 题目描述与示例
编写一个程序,找到两个单链表相交的起始节点。
例如,下面的两个链表:
A: a1 → a2
↘
c1 → c2 → c3
↗
B: b1 → b2 → b3
在节点 c1 开始相交。
注意:
如果两个链表没有交点,返回 null.
在返回结果后,两个链表仍须保持原有的结构。
可假定整个链表结构中没有循环。
程序尽量满足 O(n) 时间复杂度,且仅用 O(1) 内存。
- 解决思路
(1)判断两个链表的尾节点是否相同,如果尾节点不相同的话,一定是没有相交,也就没有交点
(2)在遍历走到尾节点的同时,可以顺便计算链表的长度
(3)比较两个链表的长度,如果存在一个链表比另一个长一些的话,那么需要从长度相等的地方开始进行比较是否有相同节点,即长链表需要把他比短链表长的那一段先走完。
- 代码
# Definition for singly-linked list.
# class ListNode(object):
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution(object):
def getIntersectionNode(self, headA, headB):
"""
:type head1, head1: ListNode
:rtype: ListNode
"""
#求链表各自的长度
lenA,lenB = 0,0
#复制两个链表,不能直接对原链表进行操作
pA = headA
pB = headB
#求长度的具体操作
while pA:
pA = pA.next
lenA += 1
while pB:
pB = pB.next
lenB += 1
#如果两个链表的尾节点不同的话,那么肯定是没有相交,也就没有公共节点的,直接输出None
if pA != pB:
return None
pA = headA
pB = headB
#如果链表1的长度比较长
if lenA > lenB:
for i in range(lenA - lenB):
pA = pA.next
#如果链表2的长度比较长
else:
for i in range(lenB - lenA):
pB = pB.next
while pA != pB:
pA = pA.next
pB = pB.next
return pA