一、題目描述
將兩個有序鏈表合併爲一個新的有序鏈表並返回。新鏈表是通過拼接給定的兩個鏈表的所有節點組成的。
示例:
輸入:1->2->4, 1->3->4
輸出:1->1->2->3->4->4
二、題目分析
首先,鏈表全部爲有序鏈表,不用考慮排序的問題,現在只需要考慮比較鏈表元素和合並的問題;只要依次從鏈表頭比較兩個鏈表中的元素大小,然後放到新鏈表中即可,可以重新創建新鏈表節點並返回一個新的鏈表空間,也可以利用舊鏈表的節點,改變指針指向,組合成新鏈表;
注意的點:
- 輸入可能全部爲空
- 局部變量初始化
- 值大小的比較
三、代碼實現
// leetcode_21. 合併兩個有序鏈表
// 歡迎繼續優化代碼
/**
* Definition for singly-linked list.
* type ListNode struct {
* Val int
* Next *ListNode
* }
*/
package main
import "fmt"
type ListNode struct {
Val int
Next *ListNode
}
// 初始化 ListNode
func initList(val int) *ListNode {
return &ListNode{val, nil}
}
// 追加 Node
func appendNode(ln *ListNode, val int) {
tmp := ln
if tmp == nil {
tmp = &ListNode{val, nil}
return
}
for tmp.Next != nil {
tmp = tmp.Next
}
tmp.Next = &ListNode{val, nil}
}
// 追加 List
func appendNodeList(ln *ListNode, node *ListNode) {
tmp := ln
if tmp == nil {
tmp = node
return
}
for tmp.Next != nil {
tmp = tmp.Next
}
tmp.Next = node
}
// 直接操作指針重新連接成所需 List
func mergeTwoLists(l1 *ListNode, l2 *ListNode) *ListNode {
tmp1 := l1
tmp2 := l2
tmp3 := new(ListNode)
tmp3_tmp := tmp3
for tmp1 != nil && tmp2 != nil {
if tmp1.Val < tmp2.Val {
tmp3_tmp.Next = tmp1
tmp1 = tmp1.Next
} else {
tmp3_tmp.Next = tmp2
tmp2 = tmp2.Next
}
tmp3_tmp = tmp3_tmp.Next
}
if tmp1 == nil {
tmp3_tmp.Next = tmp2
} else if tmp2 == nil {
tmp3_tmp.Next = tmp1
}
return tmp3.Next
}
// 創建並返回新的鏈表
func mergeTwoLists1(l1 *ListNode, l2 *ListNode) *ListNode {
tmp1 := l1
tmp2 := l2
tmp_val := 0
tmp3 := new(ListNode)
for tmp1 != nil && tmp2 != nil {
if tmp1.Val < tmp2.Val {
tmp_val = tmp1.Val
tmp1 = tmp1.Next
} else {
tmp_val = tmp2.Val
tmp2 = tmp2.Next
}
appendNode(tmp3, tmp_val)
}
if tmp1 == nil {
appendNodeList(tmp3, tmp2)
} else if tmp2 == nil {
appendNodeList(tmp3, tmp1)
}
return tmp3.Next
}
// 打印結果
func (ln *ListNode) printList() {
fmt.Printf("list: ")
for tmp := ln; tmp != nil; tmp = tmp.Next {
fmt.Printf("%d->", tmp.Val)
}
fmt.Printf("nil\n")
}
func main() {
l1 := initList(1)
l2 := initList(1)
appendNode(l1, 2)
appendNode(l1, 4)
appendNode(l2, 3)
appendNode(l2, 4)
l1.printList()
l2.printList()
l3 := mergeTwoLists(l1, l2)
//l3 := mergeTwoLists(nil, nil)
l3.printList()
}
運行結果:
list: 1->2->4->nil
list: 1->3->4->nil
list: 1->1->2->3->4->4->nil
Process finished with exit code 0
——2019-09-01——