[Swift]LeetCode160. 相交链表 | Intersection of Two Linked Lists
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
➤微信公众号:山青咏芝(shanqingyongzhi)
➤博客园地址:山青咏芝(https://www.cnblogs.com/strengthen/)
➤GitHub地址:https://github.com/strengthen/LeetCode
➤原文地址:https://www.cnblogs.com/strengthen/p/10109542.html
➤如果链接不是山青咏芝的博客园地址,则可能是爬取作者的文章。
➤原文已修改更新!强烈建议点击原文地址阅读!支持作者!支持原创!
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
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.
编写一个程序,找到两个单链表相交的起始节点。
例如,下面的两个链表:
A: a1 → a2 ↘ c1 → c2 → c3 ↗ B: b1 → b2 → b3
在节点 c1 开始相交。
注意:
- 如果两个链表没有交点,返回
nil
. - 在返回结果后,两个链表仍须保持原有的结构。
- 可假定整个链表结构中没有循环。
- 程序尽量满足 O(n) 时间复杂度,且仅用 O(1) 内存。
1 class Solution { 2 func getIntersectionNode(_ headA: ListNode?, _ headB: ListNode? ) -> ListNode? { 3 if headA == nil || headB == nil { 4 return nil 5 } 6 7 var a = headA 8 var b = headB 9 while (a !== b) { 10 if a != nil { 11 a = a?.next 12 } else { 13 a = headB 14 } 15 16 if b != nil { 17 b = b?.next 18 } else { 19 b = headA 20 } 21 } 22 return a 23 } 24 25 public class ListNode: Equatable { 26 27 public var val: Int 28 public var next: ListNode? 29 30 public init(_ val: Int) { 31 self.val = val 32 self.next = nil 33 } 34 35 public static func ==(lhs: Solution.ListNode, rhs: Solution.ListNode) -> Bool { 36 return lhs.val == rhs.val && lhs.next == rhs.next 37 } 38 } 39 }