记录LeetCode第五天(21. Merge Two Sorted Lists和链表和vector)

记录LeetCode第五天(21. Merge Two Sorted Lists)

1. 题目

Merge two sorted linked lists and return it as a new list. The new list should be made by splicing together the nodes of the first two lists.

2.例子

Example:

Input: 1->2->4, 1->3->4
Output: 1->1->2->3->4->4

这个例子就很坏了

补充例子

input: [],[1]
output: [1]

input: [2] [1]
output: [1,2]

所以其实就是从小到大排序,并不是交叉合起来。

3. 代码

class Solution {
public:
    ListNode *head, *tail;
    ListNode *p = 0;
    ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
        head = tail = 0;
        ListNode *p1,*p2;
        p1 = l1 , p2 = l2;
        int value=0;
        vector<int> a;
        while(p1 !=NULL || p2 !=NULL)//读所有的值到vector里面
        {
            if(p1 !=NULL)
            {
                value = p1->val;
                a.push_back(value);
                p1 = p1-> next;
            }               
            if(p2 !=NULL)
            {
                value = p2 ->val;
                a.push_back(value);
                p2 = p2 -> next;
            }       
        }
        while(!a.empty())//按大小排序写到新链表里面
        {
            auto smallest = min_element(begin(a),end(a));
            addnode(*smallest);
            a.erase(begin(a)+distance(begin(a),smallest));
        }
        return head;
    }
    void addnode(int value)//加结点到链表里
    {
        if(tail!=0)
        {   
            tail -> next = new ListNode(value);
            tail = tail -> next;
        }
        else
            head = tail = new ListNode(value);  
    }
    
};

虽然很长很长。。。但是还算好懂吧,第一次用链表还是很棒棒。至少速度够快。
然后是评论区厉害的大神(StefanPochmann)的代码

class Solution {
public:
    ListNode* mergeTwoLists(ListNode* a, ListNode* b) {
    if (!a || b && a->val > b->val) swap(a, b);
    if (a) a->next = mergeTwoLists(a->next, b);
    return a;
}
};

4. 链表

最简单的其实就是

struct ListNode {
	int val;
    ListNode *next;
    }

每一个节点里面包含了当前节点的值val和一个指向下一个节点的指针next
定义一个链表(或者表示链表节点):ListNode *lis; 调用结点里面值lis->value,调用节点中指向下一个节点的指针lis->next
创建一个列表:

ListNode *lis = new ListNode(val1);
lis->next = new ListNode(val2);
lis->next->next = new ListNode(val3);

链表有一个表示链表开头节点的head,一般定义为:ListNode *head和一个表示链表最后一个节点的tail, 一般定义为ListNode *tail 然后表示一个链表的时候用的是它的第一个结点head.
都要初始化为0或者NULL。
并且两个结点可以直接等号赋值。

然后有一个厉害的大神
https://zhuanlan.zhihu.com/p/22923273
讲的很详细,第一次看链表一下就看懂了。但是我这种奇奇怪怪的脑回路很可能理解的还有讲的就不是很准确了。

5.就是vector的几个函数

先有vector<int> vec
vec.distance(指针1,指针2) 就可以找到之间的距离
vec.empty()好像之前说过,就是如果空的就返回true. 所以非空循环就是while(!vec.empty())
vec.min_element(指针1,指针2)就可以找到最小值的指针*min_element(指针1,指针2) 就是最小值
vec.max_element(指针1,指针2)相对的就是最大值指针*max_element(指针1,指针2)就是最大值
还有最大最小的类型是std::vector<double>::iterator
就是 https://stackoverflow.com/questions/2953491/finding-the-position-of-the-max-element 里面的
std::cout << std::distance(sampleArray.begin(), std::max_element(sampleArray.begin(), sampleArray.end()))
就是一个很胖胖的例子。

然后还有删除并同时减小容器内存的vec.erase(指针)
https://blog.csdn.net/dongyanxia1000/article/details/52838922
很详细,各种类型删除。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值