LeetCode题目笔记--21.合并两个有序链表

题目描述

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

示例:

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/merge-two-sorted-lists
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路

  这个链表的思路很简单了,就是同时遍历两个链表,把两个根据大小重新排列一下结点顺序即可。

C++代码(low版)

class Solution {
    
    
public:
    ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
    
    
        ListNode *head = new ListNode(0);
        ListNode *cur, *pre;
        pre = head;
        while (l1 && l2)
        {
    
    
            if (l1->val <= l2->val)
            {
    
    
                cur = new ListNode(l1->val);
                l1 = l1->next;
            }
            else
            {
    
    
                cur = new ListNode(l2->val);
                l2 = l2->next;
            }
            pre->next = cur;
            pre = pre->next;
        }
        pre->next = l1 ? l1 : l2;
        return head->next;
    }
};

  这个代码运行有点慢,因为每次新节点都要重新申请空间,再仔细一想,题目好像没有要求保留原来的链表,所以可以直接在原链表上操作,原来自己刚学C语言的时候也是这样,每次都创建一个新节点,没想到速度问题。所以,直接在原链表上操作,让原来两个链表之间的**“链”**进行重组,时间空间双赢。

class Solution {
    
    
public:
    ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
    
    
        ListNode *head = new ListNode(0);
        ListNode *pre;
        pre = head;
        while (l1 && l2)
        {
    
    
            if (l1->val <= l2->val)
            {
    
    
                pre->next = l1;
                l1 = l1->next;
            }
            else
            {
    
    
                pre->next = l2;
                l2 = l2->next;
            }
            pre = pre->next;
        }
        pre->next = l1 ? l1 : l2;//l1或l2后面还有,接上去就行
        return head->next;
    }
};

  By the way,一直觉得LeetCode的OJ判时间有点莫名其妙,同样思路代码,我这提交上去是8ms,前面4ms的也是差不多的代码,更离谱的是,0ms的代码示例竟然是用的递归!然鹅我把它复制过来提交,12ms,离谱石锤了。

python代码

def mergeTwoLists(self, l1: ListNode, l2: ListNode) -> ListNode:
        pre = ListNode(0)
        head = pre
        while l1 and l2:
            if l1.val < l2.val:
                pre.next = l1
                l1 = l1.next
            else:
                pre.next = l2
                l2 = l2.next
        
            pre = pre.next
        pre.next = l1 if l1 else l2
        return head.next

  python的示例代码也是这样,这个提交上去44ms,前面快得多的也是一样的思路,0ms的也是递归。

猜你喜欢

转载自blog.csdn.net/weixin_44801799/article/details/107940374