-
Notifications
You must be signed in to change notification settings - Fork 77
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Change-Id: I32b76e12697f98f522fcd2d6255a72a650e95ae4
- Loading branch information
1 parent
293e45f
commit 1e1b44f
Showing
1 changed file
with
127 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,127 @@ | ||
/* | ||
* @lc app=leetcode.cn id=160 lang=golang | ||
* | ||
* [160] 相交链表 | ||
* | ||
* https://leetcode-cn.com/problems/intersection-of-two-linked-lists/description/ | ||
* | ||
* algorithms | ||
* Easy (50.22%) | ||
* Likes: 458 | ||
* Dislikes: 0 | ||
* Total Accepted: 56.4K | ||
* Total Submissions: 112.3K | ||
* Testcase Example: '8\n[4,1,8,4,5]\n[5,0,1,8,4,5]\n2\n3' | ||
* | ||
* 编写一个程序,找到两个单链表相交的起始节点。 | ||
* | ||
* 如下面的两个链表: | ||
* | ||
* | ||
* | ||
* 在节点 c1 开始相交。 | ||
* | ||
* | ||
* | ||
* 示例 1: | ||
* | ||
* | ||
* | ||
* 输入:intersectVal = 8, listA = [4,1,8,4,5], listB = [5,0,1,8,4,5], skipA = 2, | ||
* skipB = 3 | ||
* 输出:Reference of the node with value = 8 | ||
* 输入解释:相交节点的值为 8 (注意,如果两个列表相交则不能为 0)。从各自的表头开始算起,链表 A 为 [4,1,8,4,5],链表 B 为 | ||
* [5,0,1,8,4,5]。在 A 中,相交节点前有 2 个节点;在 B 中,相交节点前有 3 个节点。 | ||
* | ||
* | ||
* | ||
* | ||
* 示例 2: | ||
* | ||
* | ||
* | ||
* 输入:intersectVal = 2, listA = [0,9,1,2,4], listB = [3,2,4], skipA = 3, skipB | ||
* = 1 | ||
* 输出:Reference of the node with value = 2 | ||
* 输入解释:相交节点的值为 2 (注意,如果两个列表相交则不能为 0)。从各自的表头开始算起,链表 A 为 [0,9,1,2,4],链表 B 为 | ||
* [3,2,4]。在 A 中,相交节点前有 3 个节点;在 B 中,相交节点前有 1 个节点。 | ||
* | ||
* | ||
* | ||
* | ||
* 示例 3: | ||
* | ||
* | ||
* | ||
* 输入:intersectVal = 0, listA = [2,6,4], listB = [1,5], skipA = 3, skipB = 2 | ||
* 输出:null | ||
* 输入解释:从各自的表头开始算起,链表 A 为 [2,6,4],链表 B 为 [1,5]。由于这两个链表不相交,所以 intersectVal 必须为 | ||
* 0,而 skipA 和 skipB 可以是任意值。 | ||
* 解释:这两个链表不相交,因此返回 null。 | ||
* | ||
* | ||
* | ||
* | ||
* 注意: | ||
* | ||
* | ||
* 如果两个链表没有交点,返回 null. | ||
* 在返回结果后,两个链表仍须保持原有的结构。 | ||
* 可假定整个链表结构中没有循环。 | ||
* 程序尽量满足 O(n) 时间复杂度,且仅用 O(1) 内存。 | ||
* | ||
* | ||
*/ | ||
|
||
// package leetcode | ||
|
||
// 如果两个链表相交,那么交点以后的节点都是相同的,从链表尾向前找交点, | ||
// 就是看一一对比两个对齐的节点,而对齐,就是将队头多的节点去掉。 | ||
// 所以整体步骤就是先对齐,然后一一对比两个节点 | ||
|
||
// @lc code=start | ||
/** | ||
* Definition for singly-linked list. | ||
* type ListNode struct { | ||
* Val int | ||
* Next *ListNode | ||
* } | ||
*/ | ||
func getIntersectionNode(headA, headB *ListNode) *ListNode { | ||
if headA == nil || headB == nil { | ||
return nil | ||
} | ||
la := getLen(headA) | ||
lb := getLen(headB) | ||
ca := headA | ||
cb := headB | ||
if la < lb { | ||
for i := 0; i < lb-la; i++ { | ||
cb = cb.Next | ||
} | ||
} else { | ||
for i := 0; i < la-lb; i++ { | ||
ca = ca.Next | ||
} | ||
} | ||
for ca != nil && cb != nil && ca != cb { | ||
ca = ca.Next | ||
cb = cb.Next | ||
} | ||
if ca != nil && cb != nil { | ||
return ca | ||
} | ||
return nil | ||
} | ||
|
||
func getLen(head *ListNode) int { | ||
cur := head | ||
l := 0 | ||
for cur != nil { | ||
cur = cur.Next | ||
l++ | ||
} | ||
return l | ||
} | ||
|
||
// @lc code=end |