讓我們一起啃演算法----合併兩個有序連結串列

三斤和他的喵發表於2020-04-17

合併兩個有序連結串列(Merge-Two-Sorted-Lists)

題幹如下:

將兩個升序連結串列合併為一個新的升序連結串列並返回。新連結串列是通過拼接給定的兩個連結串列的所有節點組成的。
示例:
  輸入:1->2->4, 1->3->4
  輸出:1->1->2->3->4->4
來源:力扣

這個題目和 兩數相加 相似,都是考察對連結串列的操作。其實具體實現方式也差不多啦。

解題思路

根據題幹我們知道,給定的兩個連結串列是有序的。假設 l1 指向其中一個連結串列的頭部,l2 指向另一個連結串列的頭部,並初始化 headcurrent,使它們指向一個預設的節點。我們比較 l1 指向節點的值 V(l1)l2 指向節點的值 V(l2) 的大小,如果 V(l1) 的值小於 V(l2) 的值,則使 current.next 指向 l1 這個節點,current 指向下一個節點,l1 指向 l1的下一個節點,反之,則使 current.next 指向 l2 這個節點,current 指向下一個節點, l2 指向 l2的下一個節點

具體流程圖如下:

注: l1l2 存在有一個指向 時的處理方案是:將 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 協議》,轉載必須註明作者和本文連結

三斤

相關文章