💪💪💪此系列仅为记录本人补充学习数据结构相关知识,有兴趣的,大家可以共同学习👏👏👏
[= 环形链表 =]
题目描述
解题思路
利用hash表,遍历链表
判断当前元素是否在hash表中,如果在即链表中存在环
解题方法
func hasCycle(head *ListNode) bool {
// 初始化map
m := map[*ListNode]bool{}
for head != nil {
// 判断是否在map中
if _, ok := m[head]; ok {
return true
}
// 如果不在则记录
m[head] = true
head = head.Next
}
return false
}
[= 合并两个有序链表 =]
题目描述
解题思路
方法一:递归遍历
方法二:迭代(通过遍历两个链表,分别比较当前元素大小,利用指针切换指向两个链表)
解题方法
// 方法一
func mergeTwoLists(l1 *ListNode, l2 *ListNode) *ListNode {
if l1 == nil {
return l2
} else if l2 == nil {
return l1
} else if l1.Val >= l2.Val {
l2.Next = mergeTwoLists(l1, l2.Next)
return l2
} else {
l1.Next = mergeTwoLists(l1.Next, l2)
return l1
}
}
// 方法二
func mergeTwoLists(l1 *ListNode, l2 *ListNode) *ListNode {
head := &ListNode{}
curr := head
for l1 != nil || l2 != nil {
if l1 != nil && l2 != nil {
if l1.Val > l2.Val {
curr.Next = l2
l2 = l2.Next
} else {
curr.Next = l1
l1 = l1.Next
}
curr = curr.Next
} else if l1 != nil {
curr.Next = l1
break
} else if l2 != nil {
curr.Next = l2
break
}
}
return head.Next
}
[= 移除链表元素 =]
题目描述
解题思路
方法一:递归查找、删除
方法二:迭代查找、删除
解题方法
func removeElements(head *ListNode, val int) *ListNode {
if head == nil {
return head
}
head.Next = removeElements(head.Next, val)
if head.Val == val {
return head.Next
}
return head
}
//方法二
func removeElements(head *ListNode, val int) *ListNode {
heads := &ListNode{Next: head}
curr := heads
for curr != nil && curr.Next != nil {
if curr.Next.Val == val {
curr.Next = curr.Next.Next
}
curr = curr.Next
}
return heads.Next
}