leetcode21_Merge Two Sorted Lists

橘子oly發表於2016-10-17

一.問題描述

        Merge two sorted linked lists and return it as a new list. The new list should be made by splicing together the nodes of the first two lists.

        #合併兩個有序連結串列,當然要求結果也是有序連結串列

#Definition for singly-linked list.
class ListNode(object):
    def __init__(self, x):
        self.val = x
        self.next = None

二.程式碼編寫

        稍作思考,便知對有序連結串列的合併是通過兩個指標來遍歷實現的,時間複雜度O(m+n)

class Solution(object):
    def mergeTwoLists(self, l1, l2):
        """
        :type l1: ListNode
        :type l2: ListNode
        :rtype: ListNode
        """
        if l1 == None and l2 == None:
            return None
        elif l1 == None:
            return l2
        elif l2 == None:
            return l1
        elif l1.val < l2.val:
            rNode = ListNode(l1.val)
            i = l1.next
            j = l2
        else:
            rNode = ListNode(l2.val)
            i = l1
            j = l2.next
        rN = rNode
        while i != None and j != None:
            if i.val < j.val:
                rN.next = ListNode(i.val)
                i = i.next
            else:
                rN.next = ListNode(j.val)
                j = j.next
            rN = rN.next
        if i != None:
            rN.next = i
        elif j != None:
            rN.next = j
        return rNode

三.演算法改進

        上述演算法ac之後執行時間僅僅打敗百分之十幾的演算法提交,同時不得不說其程式碼也實在是冗長- -。

        兩個可改進的地方:

                1)給連結串列新增一個頭結點,則可減少多次對連結串列是否為None的判斷(輸出的時候再去掉頭結點即可)。

                2)不用每次新建一個ListNode節點新增在返回連結串列上,只用將原結點接在輸出結點後面就好。

class Solution(object):
    '''
    題意:合併兩個有序連結串列
    '''
    def mergeTwoLists(self, l1, l2):
        dummy = ListNode(0)
        tmp = dummy
        while l1 != None and l2 != None:
            if l1.val < l2.val:
                tmp.next = l1
                l1 = l1.next
            else:
                tmp.next = l2
                l2 = l2.next
            tmp = tmp.next
        if l1 != None:
            tmp.next = l1
        else:
            tmp.next = l2
        return dummy.next
               注:經測試,第二節中原始程式碼執行時間為88ms,對2)進行改進之後為69ms,對1)2)均進行改進之後(得上述程式碼)執行時間為52ms。

        總結:對連結串列而言,頭結點在關鍵時候很有用!~

相關文章