Leecode 的 21 題連結串列合併與 148 題結合的題目連結串列排序的結合的題目

MmoMartin發表於2020-06-18

題目難易程度: Easy

將兩個升序連結串列合併為一個新的 升序 連結串列並返回。新連結串列是透過拼接給定的兩個連結串列的所有節點組成的。

示例 1:

輸入:1->2->4, 1->3->4
輸出:1->1->2->3->4->4

連結串列分單連結串列與雙連結串列,還有環連結串列等形式,就單連結串列而言,連結串列結構的其他操作因在另外一張文章有寫,在這裡就不再多加敘述。
思路:目前本題的連結串列是升序連結串列,做法如下:使用遞迴完成本題。我做這兩題都是用到遞迴,基本的套路一樣。請認真觀察,這個套路很好用。

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:
    def mergeTwoLists(self, l1: ListNode, l2: ListNode) -> ListNode:
        new_node_list = None
        if  l1 == None:
            return l2
        if l2 == None:
            return l1
        if  l1.val > l2.val:
            new_node_list = l2
            new_node_list.next = self.mergeTwoLists(l1,l2.next)
        else:
            new_node_list = l1
            new_node_list.next = self.mergeTwoLists(l1.next,l2)
        return new_node_list

我在上上個星期面試阿里的第一面面試時,上機操作的題目是:兩個無續的連結串列,合併成一個有序的連結串列,步驟也操作,只是將兩個無序連結串列排序,用上述的合併方法整合就行。以下是一種排序方法。我的寫排序是 Leecode 第 148 題個人思路破解,該題難度:中等。

# 寫法很簡單的排序,但是佔用記憶體空間上升。
class Solution:
    def sortList(self, head: ListNode) -> ListNode:
        list_tmp = []
        if head:
            while head.next:
                list_tmp.append(head.val)
                head = head.next
            list_tmp.append(head.val)

            list_data_sort = sorted(list_tmp)
            def nodeListSort(list_data_sort,i=0):
                new_list_node = None
                if i < len(list_data_sort):
                    new_list_node = ListNode(list_data_sort[i])
                    i += 1
                    new_list_node.next = nodeListSort(list_data_sort,i)
                return new_list_node
            return nodeListSort(list_data_sort)

做完上面那道題後,發現 Leecode 有類似的題目:

Leecode18. 刪除連結串列的節點

題目難易程度: Easy
給定單向連結串列的頭指標和一個要刪除的節點的值,定義一個函式刪除該節點。
返回刪除後的連結串列的頭節點。

示例 1:

輸入: head = [4,5,1,9], val = 5
輸出: [4,1,9]
解釋: 給定你連結串列中值為 5 的第二個節點,那麼在呼叫了你的函式之後,該連結串列應變為 4 -> 1 -> 9.

示例 2:

輸入: head = [4,5,1,9], val = 1
輸出: [4,5,9]
解釋: 給定你連結串列中值為 1 的第三個節點,那麼在呼叫了你的函式之後,該連結串列應變為 4 -> 5 -> 9.
# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None
class Solution:
    def deleteNode(self, head: ListNode, val: int) -> ListNode:
        new_list_node = None
        if head.val == val:
            new_list_node = head.next
            return new_list_node
        else:
            new_list_node = head
            new_list_node.next = self.deleteNode(head.next, val)
        return new_list_node

相關文章