声明:
今天是第35道题。编写一个程序,找到两个单链表相交的起始节点。以下所有代码经过楼主验证都能在LeetCode上执行成功,代码也是借鉴别人的,在文末会附上参考的博客链接,如果侵犯了博主的相关权益,请联系我删除
(手动比心ღ( ´・ᴗ・` ))
正文
题目:编写一个程序,找到两个单链表相交的起始节点。
例如,下面的两个链表:
A: a1 → a2 ↘ c1 → c2 → c3 ↗ B: b1 → b2 → b3在节点 c1 开始相交。
注意:
- 如果两个链表没有交点,返回
null
- 在返回结果后,两个链表仍须保持原有的结构
- 可假定整个链表结构中没有循环
- 程序尽量满足 O(n) 时间复杂度,且仅用 O(1) 内存、
解法1。若两个链表不等长,较长的链表遍历完毕后(假设p1指向较长的链表),p1重新指向headB,此时p2指向的元素就和p1指向的元素对齐了,想象一下,此时两链表右对齐。在此之后的遍历就能顺利找到相交节点,代码如下。
# 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
"""
# V 1.0,能提交
p1 = headA
p2 = headB
while(p1 != p2):
p1 = headB if p1 is None else p1.next
p2 = headA if p2 is None else p2.next
return p1
解法2。 方法2更好理解一点,就是先把两个链表右对齐(不过这样相当于假设相交节点在后面,如果在前面就gg了??),但下面的代码没有考虑这点,也能执行成功
class Solution(object):
def getIntersectionNode(self, headA, headB):
"""
:type head1, head1: ListNode
:rtype: ListNode
"""
# V 2.0,能提交
# 计算两个链表的长度cnt_A、cnt_B
p1 = headA
p2 = headB
cnt_A = 0
cnt_B = 0
while p1 is not None:
p1 = p1.next
cnt_A += 1
while p2 is not None:
p2 = p2.next
cnt_B += 1
# p1,p2要重新赋值,因为上述计算长度时两者已指向None了
p1 = headA
p2 = headB
if cnt_A > cnt_B:
diff = cnt_A - cnt_B # 让长度更长的链表和更短的链表(右)对齐
while diff>0:
p1 = p1.next
diff -= 1
else:
diff = cnt_B - cnt_A
while diff>0:
p2 = p2.next
diff -= 1
while p1 != p2:
p1 = p1.next
p2 = p2.next
return p1
结尾
解法1:https://blog.csdn.net/weixin_40449300/article/details/81211806
解法2:https://blog.csdn.net/qq_34364995/article/details/80518198