Easy 21 – 合并两个有序链表

给定两个有序链表(linked list),要求返回一个有序链表。

我第一反应是把所有的value取出来,然后直接sorted,这样问题就解决了。转念一想,搞两个循环再加一个本身就很需要时间的方法,这个办法怎么听都很蠢,而且就算把两个链表里的元素都存到了一个list里,我还要再把sorted list做成链表,这样听起来这个办法更蠢了。(但能解决问题对不对?工程思维突然浮现了!)

还是直接看答案吧家人们,看了看答案就知道,这绝对不是我这种半吊子都达不到的人能想出来的。

第一种解法是用了递归的思想,是给了代码我能看懂,但让我自己写我绝对写不出来的程度。

class Solution:
    def mergeTwoLists(self, list1: Optional[ListNode], list2: Optional[ListNode]) -> Optional[ListNode]:
        if list1 is None:
            return list2
        elif list2 is None:
            return list1
        elif list1.val < list2.val:
            list1.next = self.mergeTwoLists(list1.next, list2)
            return list1
        else:
            list2.next = self.mergeTwoLists(list1, list2.next)
            return list2

leetcode的题解对递归的思想进行了解释,其实有点像高中数学刚学函数那会儿做的题目,一步步的往下推,直到有已知的函数值为止。

已知:f(x) = f (x-1) + 2, f(0) = 0,求f(5)

一边写一边感觉DNA动了……要做这道题的话,就是一路写下去,然后发现f(1)的值可求(是2),然后一路再加上来,发现f(5)的值是10.

当然了,道理是简单的,例题也总是比较简洁易懂,但是实际情况肯定会比这种简单的累加更抽象更难懂。合并列表还是easy,但是已经有点难以理解了。(反正对我来说已经猪脑过载。

第二个是用迭代的想法,这个和我在最开始提出来的想法差不多,同样借助另外一个空的链表进行数据的存储。等到有一个链表空了就把next指向另外一个list接下来的值就可以了。

class Solution:
    def mergeTwoLists(self, l1: ListNode, l2: ListNode) -> ListNode:
        prehead = ListNode(-1)

        prev = prehead
        while l1 and l2:
            if l1.val <= l2.val:
                prev.next = l1
                l1 = l1.next
            else:
                prev.next = l2
                l2 = l2.next            
            prev = prev.next

        # 合并后 l1 和 l2 最多只有一个还未被合并完,我们直接将链表末尾指向未合并完的链表即可
        prev.next = l1 if l1 is not None else l2

        return prehead.next

这个没啥好说的,那这个题目就到这儿吧……

下次要是再遇到类似的,我肯定自己先试试!

Leave a Reply