LeetCode Intersection of Two Linked Lists
Posted gavinfish
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode Intersection of Two Linked Lists相关的知识,希望对你有一定的参考价值。
LeetCode解题之Intersection of Two Linked Lists
原题
找出两个单向链表是在哪个节点开始合二为一的。
注意点:
- 如果没有交集,那么返回None
- 返回结果时要保证链表还是原来的结构
- 链表中没有环形结构
- 最好时间复杂度为O(n),空间复杂度为O(1)
例子:
输入:
A: a1 → a2
↘
c1 → c2 → c3
↗
B: b1 → b2 → b3
输出: c1
解题思路
最容易想到的方法是双指针,在交点之前,两个链表的长度不同,如果我们知道他们的长度差,那么只要在长的链表上先前进他们相差的节点数,然后两个指针同时各自在两个链表上前进,那么当他们相遇的时候就是第一个相交的节点。而那个差就是两个链表的长度差,因为它们的后半部分是相同的。
上面是通过让长链表上的指针先走的方法,其实我们也可以在链表前加长,使得它们在交点之前的长度相等,在上面的例子中,我们可以在链表A之前加上一个链表B,在链表B之前加上一个链表A,这时两条链表的总长度相同,都是原来两条链表的长度和,那么在它们交点前的链表长度也是相等的。让两个指针同时前进直到相交即可。
还可以通过复用Linked List Cycle II的代码来实现,我们将链表A的尾部连接到它的头部,这道题就变成找出链表中环的起始位置了。不过要记得将链表恢复原样。
AC源码
# 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
"""
nodeA, nodeB = headA, headB
while nodeA != nodeB:
nodeA = nodeA.next if nodeA else headB
nodeB = nodeB.next if nodeB else headA
return nodeA
def getIntersectionNode_diff(self, headA, headB):
"""
:type head1, head1: ListNode
:rtype: ListNode
"""
def get_length(node):
length = 0
while node:
node = node.next
length += 1
return length
len1 = get_length(headA)
len2 = get_length(headB)
if len1 > len2:
for __ in range(len1 - len2):
headA = headA.next
else:
for __ in range(len2 - len1):
headB = headB.next
while headA:
if headA == headB:
return headA
headA = headA.next
headB = headB.next
return None
if __name__ == "__main__":
None
欢迎查看我的Github (https://github.com/gavinfish/LeetCode-Python) 来获得相关源码。
以上是关于LeetCode Intersection of Two Linked Lists的主要内容,如果未能解决你的问题,请参考以下文章
LeetCode:Intersection of Two Arrays
LeetCode:Intersection of Two Linked Lists
[LeetCode] Intersection of Two Arrays II
[leetcode]349.Intersection of Two Arrays