【问题标题】:Merging two sorted linked lists in Python在 Python 中合并两个排序的链表
【发布时间】:2019-02-26 10:54:32
【问题描述】:

我正在解决一个 Leetcode 问题(问题 #21),它采用两个排序的链表并返回一个排序后的合并链表。例如,输入:1->2->4、1->3->4 和输出:1->1->2->3->4->4。

我对链表不是很有经验,但我正在尝试解决更多问题以获得曝光率。我的代码没有返回 [1,1,2,3,4,4] 的所需输出,而是返回 [4]。但是,我认为主要逻辑就在那里,我希望我遗漏了一些小东西。

def mergeTwoLists(self, l1, l2):
        """
        :type l1: ListNode
        :type l2: ListNode
        :rtype: ListNode
        """
        newList = ListNode(0) # used for single, merged list
        while l1 and l2:
            if l1.val <= l2.val: # compare current node's values
                newList.next = l1
                l1 = l1.next
            else:
                newList.next = l2
                l2 = l2.next

        return newList.next # first node is 0, which we don't want

【问题讨论】:

  • 这有两种基本的变体。一种是将两个列表合并到一个空列表中,另一种是将其中一个列表合并到另一个列表中,这可能会更快一些,因为有些时候,只需要对要合并到的列表的引用先进的,而不是必须设置链接。

标签: python sorting merge linked-list


【解决方案1】:

主要逻辑几乎就在那里,但您每次只替换列表中的下一项(您没有推进列表),因此您只返回最后一项。解决方案是创建另一个“cur 指针”来推进列表,同时保持 newList 作为返回结果的“前端指针”。

最后,你应该'连接'非空列表

def mergeTwoLists(self, l1, l2):
    newList = ListNode(0)
    cur = newList 
    while l1 and l2:
        if l1.val < l2.val:
            cur.next = l1
            l1 = l1.next
        else:
            cur.next = l2
            l2 = l2.next
        cur = cur.next
    cur.next = l1 or l2 # add non-empty list
    return newList.next

【讨论】:

  • 感谢您的帮助并指出我代码中的问题!我明白了用 cur = cur.next 推进当前指针的要点。但是,我有两个后续问题:1)cur.next = l1 或 l2 做什么?和 2) cur = newList 做什么/newList.next 如何能够返回正确的结果?
  • @JaneSully 1) while 循环在一个列表为空时终止,l1 or l2 如果有一个列表,则为我们提供非空列表。如果可以写成:if l1: cur.next = l1 else: cur.next = l2
  • @JaneSully 2) cur = newList 为我们提供了对新节点的引用(注意,这不是创建新的实际副本,而只是一个引用),因此我们可以使用 cur 来推进链表,虽然 newList 仍将是对值为 0 的节点的引用,但返回 newList.next 会为我们提供附加的第一项(如果有)。
  • 感谢您的超级有用的澄清!一个快速跟进:由于 cur 使用 cur = newList 引用新节点,我们是否不想推进 newList 而不是 cur(这是否重要)?再次感谢!
  • @JaneSully 可以在代码中将所有 cur 与 newList 交换,它仍然可以工作。您需要有一个指向列表开头的列表(您不前进)以返回结果。
【解决方案2】:
a1=[3,9,1]
a2=[8,3,4]

a = a1 + a2
a.sort()

应该做的伎俩。

【讨论】:

  • 如果我使用的是数组,这会起作用,但问题是专门为链表设置的。
  • Python 列表实际上可以用于真正的链接数据结构,而不是许多示例中的数字或字符列表。没想到发帖人真的想用 Python 解决链表问题。
猜你喜欢
  • 1970-01-01
  • 2014-04-25
  • 2011-01-21
  • 1970-01-01
相关资源
最近更新 更多