前言
一个continue写成break导致问题找了好久
正文
问题来源
本问题来自leetcode上的23题。用go语言做的
问题描述
给定一个字符串,找出不含有重复字符的最长子串的长度。
示例 1:
合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。
示例:
输入:
[
1->4->5,
1->3->4,
2->6
]
输出: 1->1->2->3->4->4->5->6
分析:
暴力解法(自然是我自己想到的,总是不想最优解法) Go代码如下:
func mergeKLists(lists []*ListNode) *ListNode {
head := &ListNode{0, nil}
q := head
if lists == nil {
return nil
}
var nilCount int
len := len(lists)
var min int
var minIndex int
for {
nilCount = 0
i := 0
for ; i < len; i++ {
if nil == lists[i] {
nilCount++
continue
} else {
min = lists[i].Val
minIndex = i
break
}
}
if nilCount == len {
break
}
j := i
for ; j < len; j++ {
if nil == lists[j] {
continue
} else if min > lists[j].Val {
min = lists[j].Val
minIndex = j
}
}
q.Next = lists[minIndex]
q = q.Next
lists[minIndex] = lists[minIndex].Next
}
return head.Next
}
其实这道题应该用分治来解(别人家的代码)
func doMerge(l1, l2 *ListNode) *ListNode {
if l1 == nil {
return l2
}
if l2 == nil {
return l1
}
var h *ListNode
var prev *ListNode
for l1 != nil && l2 != nil {
var node *ListNode
if l1.Val <= l2.Val {
node = l1
l1 = l1.Next
} else {
node = l2
l2 = l2.Next
}
if prev == nil {
h = node
prev = node
} else {
prev.Next = node
prev = node
}
}
if l1 != nil {
prev.Next = l1
} else if l2 != nil {
prev.Next = l2
}
return h
}
func mergeKLists(lists []*ListNode) *ListNode {
if len(lists) == 0 {
return nil
}
for {
if len(lists) == 1 {
return lists[0]
}
next := make([]*ListNode, 0)
var i = 0
for i = 1; i < len(lists); i = i + 2 {
node := doMerge(lists[i-1], lists[i])
next = append(next, node)
}
if len(lists) % 2 != 0 {
next = append(next, lists[len(lists)-1])
}
lists = next
}
}
总结:
多思考是否有简单并且高效的解法
结语
闲来无事的话,多练习练习,做做题。