Write a program to find the node at which the intersection of two singly linked lists begins.
For example, the following two linked lists:
1 2 3 4 5
| 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.
思路
首先要明白题意,如果两个链表相交,这两个链表也不会再分离开。
从而可以先求出链表的长度。如果两个链表相交,对齐它们的尾部,总会在其中一个节点,两链表的值相同。
根据此思路,从而求出链表值相同的那个节点,即可以满足题意。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
| # 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 """ curA = headA curB = headB lenA = 0 lenB = 0 while (curA): curA = curA.next lenA += 1 while (curB): curB = curB.next lenB += 1 if (curA != curB): return None else: curA = headA curB = headB if (lenA >= lenB): for i in range(lenA-lenB): curA = curA.next else: for i in range(lenB-lenA): curB = curB.next while (curA and curB): if (curA == curB): return curA else: curA = curA.next curB = curB.next return None
|