intersection-of-two-linked-lists
This commit is contained in:
parent
1a9d996416
commit
70fa350da8
|
@ -0,0 +1,29 @@
|
|||
package main
|
||||
|
||||
type ListNode struct {
|
||||
Val int
|
||||
Next *ListNode
|
||||
}
|
||||
|
||||
// O(n+m) time and O(n) memory solution
|
||||
// Only iterates over each list once, unlike
|
||||
// the other solution which iterates twice.
|
||||
/**
|
||||
* Definition for singly-linked list.
|
||||
* type ListNode struct {
|
||||
* Val int
|
||||
* Next *ListNode
|
||||
* }
|
||||
*/
|
||||
func getIntersectionNode(headA, headB *ListNode) *ListNode {
|
||||
exists := map[*ListNode]bool{}
|
||||
for current := headA; current != nil; current = current.Next {
|
||||
exists[current] = true
|
||||
}
|
||||
for current := headB; current != nil; current = current.Next {
|
||||
if exists[current] {
|
||||
return current
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
|
@ -0,0 +1,43 @@
|
|||
package main
|
||||
|
||||
type ListNode struct {
|
||||
Val int
|
||||
Next *ListNode
|
||||
}
|
||||
|
||||
// O(n + m) time and O(1) memory solution
|
||||
// Gets the length of each list, then
|
||||
// lines them up and searches for equal
|
||||
// nodes.
|
||||
/**
|
||||
* Definition for singly-linked list.
|
||||
* type ListNode struct {
|
||||
* Val int
|
||||
* Next *ListNode
|
||||
* }
|
||||
*/
|
||||
func getIntersectionNode(headA, headB *ListNode) *ListNode {
|
||||
len1, len2 := getLen(headA), getLen(headB)
|
||||
diff := len1 - len2
|
||||
for diff > 0 {
|
||||
headA = headA.Next
|
||||
diff--
|
||||
}
|
||||
for diff < 0 {
|
||||
headB = headB.Next
|
||||
diff++
|
||||
}
|
||||
for headA != headB {
|
||||
headA = headA.Next
|
||||
headB = headB.Next
|
||||
}
|
||||
return headA
|
||||
}
|
||||
|
||||
func getLen(head *ListNode) int {
|
||||
len := 0
|
||||
for current := head; current != nil; current = current.Next {
|
||||
len++
|
||||
}
|
||||
return len
|
||||
}
|
Loading…
Reference in New Issue