遞歸實現與非遞歸實現
/**
* @Description: 鏈表的遍歷
*
* @Date:
* @Author: fuGuoWen
* @Return
* @Throws
*/
func Print(l1 *ListNode) {
for l1 != nil {
fmt.Println(l1.Val)
l1 = l1.Next
}
}
/**
* @Description: 合併兩個有序的鏈表 非遞歸實現
* 時間複雜度O(m+n) 空間複雜度O(1)
* @Date:
* @Author: fuGuoWen
* @Return
* @Throws
*/
func mergeTwoLists(l1 *ListNode, l2 *ListNode) *ListNode {
head := &ListNode{}
result := head
for l1 != nil && l2 != nil {
if l1.Val < l2.Val {
head.Next = l1
l1 = l1.Next
} else {
head.Next = l2
l2 = l2.Next
}
head = head.Next
}
if l1 != nil {
head.Next = l1
}
if l2 != nil {
head.Next = l2
}
return result.Next
}
/**
* @Description: 合併兩個有序的鏈表 遞歸實現
* 時間複雜度O(m+n) 空間複雜度O(1)
* @Date:
* @Author: fuGuoWen
* @Return
* @Throws
*/
func mergeTwoLists2(l1 *ListNode, l2 *ListNode) *ListNode {
if l1 == nil {
return l2
}
if l2 == nil {
return l1
}
if l1.Val < l2.Val {
l1.Next = mergeTwoLists(l1.Next, l2)
return l1
} else {
l2.Next = mergeTwoLists(l1, l2.Next)
return l2
}
}
/** 鏈表的結構 */
type ListNode struct {
Val int
Next *ListNode
}
測試代碼
func main() {
/** 創建鏈表1 */
l1 := ListNode{1, nil}
l2 := ListNode{2, nil}
l3 := ListNode{4, nil}
l1.Next = &l2
l2.Next = &l3
//打印鏈表1
print(&l1)
fmt.Println("=============")
/** 常見鏈表2 */
l4 := ListNode{1, nil}
l5 := ListNode{3, nil}
l6 := ListNode{4, nil}
l4.Next = &l5
l5.Next = &l6
/** 打印鏈表2 */
print(&l4)
fmt.Println("=============")
/** 合併兩個有序的鏈表 */
//result := mergeTwoLists(&l1, &l4)
result := mergeTwoLists2(&l1, &l4)
print(result)
//l1 := ListNode{1, nil}
//l2 := ListNode{2, nil}
//l3 := ListNode{3, nil}
//l4 := ListNode{4, nil}
//l5 := ListNode{5, nil}
//l1.Next = &l2
//l2.Next = &l3
//l3.Next = &l4
//l4.Next = &l5
//Print(&l1)
//fmt.Println("==================")
////result := reverseList(&l1)
//result := reverseList2(&l1)
//Print(result)
}