Leetcode 21:2つの秩序チェーンテーブルをマージ(最も詳細な解決策!!)


2つの順序付きチェーンテーブルを新しい順序付きチェーンテーブルに結合して返します.新しいチェーンテーブルは、指定された2つのチェーンテーブルのすべてのノードを接合することによって構成されます.
例:
  :1->2->4, 1->3->4
  :1->1->2->3->4->4

問題を解く構想.
この問題は簡単で、新しいチェーンテーブルを新しく作成します.2つのポインタcur1およびcur2が確立され、それぞれ2つのチェーンテーブルを指す.次に、2つのチェーンテーブルの各要素のサイズを比較することで、小さな要素を新しいチェーンテーブルに追加するだけです.最後に、cur1cur2がそれぞれのチェーンテーブルの末尾であるかどうかを判断し、そうでなければ、残りの要素を新しいチェーンテーブルの末尾に追加すればよい.
class Solution:
    def mergeTwoLists(self, l1, l2):
        """
        :type l1: ListNode
        :type l2: ListNode
        :rtype: ListNode
        """
        h = ListNode(-1)
        cur = h

        cur1 = l1
        cur2 = l2

        while cur1 != None and cur2 != None:
            if cur1.val <= cur2.val:
                cur.next = cur1
                cur1 = cur1.next
            else:
                cur.next = cur2
                cur2 = cur2.next
            cur = cur.next
        
        if cur1 != None:
            cur.next = cur1

        if cur2 != None:
            cur.next = cur2
        return h.next

上の書き方をもっと簡潔に書くこともできます
class Solution:
    def mergeTwoLists(self, l1, l2):
        """
        :type l1: ListNode
        :type l2: ListNode
        :rtype: ListNode
        """
        head = pre = ListNode(-1)

        while l1 or l2:
            if not l1:
                pre.next = l2
                break
            elif not l2:
                pre.next = l1
                break
            elif l1.val < l2.val:
                pre.next = l1
                l1 = l1.next
            else:
                pre.next = l2
                l2 = l2.next
            pre = pre.next
        return head.next

この問題のもっと優秀な解法は再帰であるべきだ.
class Solution:
    def mergeTwoLists(self, l1, l2):
        """
        :type l1: ListNode
        :type l2: ListNode
        :rtype: ListNode
        """
        if not l1: return l2
        if not l2: return l1
        
        if l1.val < l2.val:
            l1.next =  self.mergeTwoLists(l1.next, l2)
            return l1
        else:
            l2.next = self.mergeTwoLists(l1, l2.next)
            return l2

この問題の他の言語バージョンをGitHub Leetcodeに追加しました
もし問題があれば、皆さんに指摘してほしい!!!