leetcode-21 | 合并两个有序链表 简单难度

题目描述

将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。

示例 1:
输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4

思路解答

比较简单,遍历两个链表,比较大小,加入新链表即可。

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

class Solution(object):
    def mergeTwoLists(self, l1, l2):
        """
        :type l1: ListNode
        :type l2: ListNode
        :rtype: ListNode
        """
        if l1 is None:
            return l2
        if l2 is None:
            return l1

        #正式开始
        p, q = l1, l2
        #不妨设置虚拟头结点
        virtualhead = ListNode(0)
        vp = virtualhead
        while p or q:
            if p and q:
                if p.val <= q.val:
                    vp.next = p
                    #vp = vp.next
                    p = p.next
                else:
                    vp.next = q
                    #vp = vp.next
                    q = q.next

            elif p:
                vp.next = p
                #vp = vp.next
                p = p.next
            else:
                vp.next = q
                #vp = vp.next
                q = q.next
            vp = vp.next

        return virtualhead.next

结果:

执行用时 : 44 ms, 在Merge Two Sorted Lists的Python提交中击败了23.88% 的用户
内存消耗 : 11.7 MB, 在Merge Two Sorted Lists的Python提交中击败了34.70% 的用户

提交时间状态执行用时内存消耗语言
几秒前通过44 ms11.7MBpython
## 优化 不必建立列表存储,直接加入
# Definition for singly-linked list.
# class ListNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution(object):
    def mergeTwoLists(self, l1, l2):
        """
        :type l1: ListNode
        :type l2: ListNode
        :rtype: ListNode
        """
        if l1 is None:
            return l2
        if l2 is None:
            return l1

        #正式开始
        p, q = l1, l2
        #不妨设置虚拟头结点
        virtualhead = ListNode(0)
        vp = virtualhead
        while p and q:
            if p.val <= q.val:
                vp.next = p
                #vp = vp.next
                p = p.next
            else:
                vp.next = q
                #vp = vp.next
                q = q.next
            vp = vp.next
        if p:
            vp.next = p
        if q:
            vp.next = q

        return virtualhead.next

结果:

执行用时 : 40 ms, 在Merge Two Sorted Lists的Python提交中击败了53.32% 的用户
内存消耗 : 11.7 MB, 在Merge Two Sorted Lists的Python提交中击败了34.09% 的用户

提交时间状态执行用时内存消耗语言
几秒前通过40 ms11.7MBpython

当然了,上面的两个if还可以简化:vp.next = p if p else q
不过,运算量是一样的,只是代码量减少了。


   Reprint policy


《leetcode-21 | 合并两个有序链表 简单难度》 by 梦否 is licensed under a Creative Commons Attribution 4.0 International License
 Previous
leetcode-24 |  两两交换链表中的节点 中等难度 leetcode-24 | 两两交换链表中的节点 中等难度
题目描述给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。 示例 1:给定 1->2->3->4, 你应该返回 2->1->4->
2019-05-08
Next 
leetcode-82 | 删除排序链表中的重复元素 II leetcode-82 | 删除排序链表中的重复元素 II
题目描述给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字。 示例 1:输入: 1->2->3->3->4->4->5输出: 1->2->5 示例 2:
2019-05-08
  TOC