合併兩個有序連結串列(Merge-Two-Sorted-Lists)
題幹如下:
將兩個升序連結串列合併為一個新的升序連結串列並返回。新連結串列是通過拼接給定的兩個連結串列的所有節點組成的。
示例:
輸入:1->2->4, 1->3->4
輸出:1->1->2->3->4->4
來源:力扣
這個題目和 兩數相加 相似,都是考察對連結串列的操作。其實具體實現方式也差不多啦。
解題思路
根據題幹我們知道,給定的兩個連結串列是有序的。假設 l1 指向其中一個連結串列的頭部,l2 指向另一個連結串列的頭部,並初始化 head 和 current,使它們指向一個預設的節點。我們比較 l1 指向節點的值 V(l1) 與 l2 指向節點的值 V(l2) 的大小,如果 V(l1) 的值小於 V(l2) 的值,則使 current.next 指向 l1 這個節點,current 指向下一個節點,l1 指向 l1的下一個節點,反之,則使 current.next 指向 l2 這個節點,current 指向下一個節點, l2 指向 l2的下一個節點。
具體流程圖如下:
注: l1 和 l2 存在有一個指向 空 時的處理方案是:將 current.next 指向不是空的的連結串列即可,因為給定的兩個連結串列本身是有序的。
程式碼實現
GO語言實現
func mergeTwoLists(l1 *ListNode, l2 *ListNode) *ListNode {
var (
head = &ListNode{}
current = head
)
for true {
// l1 為空時,將 current.next 指向 l2 即可
if l1 == nil {
current.Next = l2
break
}
// l2 為空時,將 current.next 指向 l1 即可
if l2 == nil {
current.Next = l1
break
}
// 如果 l1的值 小於 l2的值 current.next指向l1,l1後移
if l1.Val < l2.Val {
current.Next = l1
l1 = l1.Next
} else {
// 如果 l2的值 小於等於 l1的值 current.next指向l2,l2後移
current.Next = l2
l2 = l2.Next
}
// current 後移一位
current = current.Next
}
// head 指向的是預設的節點,head.next 才是結果連結串列的頭節點
return head.Next
}
總結
每天進步一點點,加油!
演算法教程專案,每天更新一題,點個 star 支援一下呀:
https://github.com/wx-satellite/learning-a…
本作品採用《CC 協議》,轉載必須註明作者和本文連結