萌新小白LeetCode之路——21.Merge Two Sorted(49.8%)

萌新小白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% 。还是想写较快的代码,应该再看看能不能修改。

发布了33 篇原创文章 · 获赞 15 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_35764460/article/details/85730957