主な説明を考慮し、比較的速い問題解決のためのプログラム可能な問題を取ったときに1つの速度でコードを書きます。
コードを解いて行きます
/**
* Definition for singly-linked list.
* type ListNode struct {
* Val int
* Next *ListNode
* }
*/
func mergeTwoLists(l1 *ListNode, l2 *ListNode) *ListNode {
newList := &ListNode{0, nil}
currentNode := newList
for l1 != nil && l2 != nil {
var num int
if l1.Val > l2.Val {
num = l2.Val
l2 = l2.Next
} else {
num = l1.Val
l1 = l1.Next
}
currentNode.Next = &ListNode{num, nil}
currentNode = currentNode.Next
}
//标记(1)
if l1 != nil {
currentNode.Next = l1
} else {
currentNode.Next = l2
}
return newList.Next
}
問題があります
タグ(1)ここで、L1またはL2が存在しても一つだけのリストトラバーサルが完了していないされ(すなわち、:。!L1またはL2 = nilの)は、直接、不完全リンクリストのノードを横断することができ、ポインタの新たなリストとノードポインタ。!!!これは、効率の実装をスピードアップするための方法ですが、不注意に変更したり、リストL1またはL2の内容を解放した場合、彼らはアクセスの問題が発生することがあり、ポインタ操作に属しているのでとき、ポインタの新たなリスト、未知のデータへのアクセス、そこにセキュリティ問題。
トリガー試験問題(Goが少なく、手動でメモリ変数を解放し、通常GCは自動的に処理するので、相対が発生する可能性が書いたように見えました):
func main() {
l2 := &ListNode{1, nil}
ret := mergeTwoLists(nil, l2)
fmt.Println(ret.Val)
l2.Val = 2
fmt.Println(ret.Val)
}
出力:
1
、新しいリストの値が得られ、L2ノードの変更、の値も変更されますので、ここでは2 //テストケース。
コードを解決するための相対的な安全性
/**
* Definition for singly-linked list.
* type ListNode struct {
* Val int
* Next *ListNode
* }
*/
func mergeTwoLists(l1 *ListNode, l2 *ListNode) *ListNode {
newList := &ListNode{0, nil}
currentNode := newList
for l1 != nil && l2 != nil {
var num int
if l1.Val > l2.Val {
num = l2.Val
l2 = l2.Next
} else {
num = l1.Val
l1 = l1.Next
}
currentNode.Next = &ListNode{num, nil}
currentNode = currentNode.Next
}
//标记(2)
for l2 != nil {
currentNode.Next = &ListNode{l2.Val, nil}
currentNode = currentNode.Next
l2 = l2.Next
}
for l1 != nil {
currentNode.Next = &ListNode{l1.Val, nil}
currentNode = currentNode.Next
l1 = l1.Next
}
return newList.Next
}
説明
(2)数字1でのみコードマークで次のコードは、代わりに追加する不完全横断ノードを残りの元の値のリストで、最初の問題解決コード直接参照ポインタ方法異なっています新しいリストデータを誤って変更することができないことを保証するために、可能な限り、リストの新しい方法を追加しました。