160. Intersection of Two Linked Lists
Write a program to find the node at which the intersection of two singly linked lists begins.
For example, the following two linked lists:
A: a1 → a2
↘
c1 → c2 → c3
↗
B: b1 → b2 → b3
begin to intersect at node c1.
Notes:
If the two linked lists have no intersection at all, return null.
- The linked lists must retain their original structure after the function returns.
- You may assume there are no cycles anywhere in the entire linked structure.
- Your code should preferably run in O(n) time and use only O(1) memory.
Solution
# 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
"""
# A length = a + c, B length = b + c, after switching pointer, pointer A will move another b + c steps, pointer B will move a + c more steps,
# since a + c + b + c = b + c + a + c, it does not matter what value c is.
# Pointer A and B must meet after a + c + b (b + c + a) steps. If c == 0, they meet at NULL.
if not headA or not headB:
return None
pA = headA
pB = headB
# if the two lists have no intersection at all,you should stop after you've already checked L1+L2,
# so we need a flag jumpToNext to ensure we only traverse L1 + L2 once.
jumpToNext = False
while pA and pB:
if pA == pB:
return pA
pA, pB = pA.next, pB.next
if not pA and not jumpToNext:
pA = headB
jumpToNext = True
if not pB:
pB = headA
return None
其他方法:
-
先翻转两个链表,找到汇合节点再将两个链表翻转回来。
-
先得到两个链表的长度,然后从相同长度的地方开始判断。但是时间复杂度高了。