萌新小白LeetCode之路——21.Merge Two Sorted(49.8%)
题目:合并两个排序的链表,并将其作为一个新列表返回。新列表应该通过拼接前两个列表的节点来创建。
实例:
Input: 1->2->4, 1->3->4
Output: 1->1->2->3->4->4
解题思路:这种题目在数据结构书中,都有源代码,天勤王道上均有。本着先解题的想法,先试试书上代码结构。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
这里他题目上定义了一个结构体,我们在使用ListNode类时应该参考上面的结构体。
ListNode *c = new ListNode(0);
先定义一个C来储存结果,比较两个链表中最小的一个,连接C后面,连接后,向链表后面移动,一直比较取较小的数连接,直到其中的一个链表为空。但是,此时可能另一个不为空,直接让不为空的链表接在后面即可。
解题代码:
// Merge Two Sorted Lists
class Solution {
public:
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
ListNode *c = new ListNode(0);
if(l1==NULL)
return l2;
if(l2==NULL)
return l1;
ListNode *p = l1;
ListNode *q = l2;
ListNode *r;
r=c;
while(p!=NULL && q!=NULL)
{
if(p->val<q->val)
{
r->next = p;
p=p->next;
r=r->next;
}
else
{
r->next = q;
q=q->next;
r = r->next;
}
}
if(p!=NULL)
{
r->next = p;
}
if(q!=NULL)
{
r->next = q;
}
c = c->next;
return c;
}
};
但是我们应该注意到,C的链表在初始化的时候有一个结点为 0 ,所以我们应该删除最后一个结点。
头结点为C,直接删除就好。
写在后面:
一个在数据结构上被用烂的代码,但是写起了也不是那么的顺畅,还是应该多动笔才行。最后结果是faster 49.8% 。还是想写较快的代码,应该再看看能不能修改。