题目描述
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例:
输入: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的也是递归。