这道题其实和合并两个排序数组的思路是一样的,只不过把数组换成了更加复杂一点的链表。与其说这是一道算法题,不如说这道题目考察的还是基础的指针和链表的使用操作方面的知识。
在C++中,链表是通过结构体实现的,这个结构体中包括节点的值,和指向下一个节点的指针。操作链表之类的结构时,基本上就是全程依靠指针进行操作了。
还有就是介绍一下new函数,这个函数是C++中手动申请内存空间使用的函数,执行new时会先申请一块空间并初始化一个对象,然后返回该空间的指针。利用这点我们就可以在一个链表节点后面再添加一个节点。以及->运算符,其实p1->val就相当于(*p1).val ,->这种形式使得代码可读性更强一些。
关于链表的遍历,很容易想到p1=p1->next就可以将指针后移一位。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
ListNode* p1=l1;
ListNode* p2=l2;
ListNode* res;
if(p1==nullptr) return p2;
if(p2==nullptr) return p1;
if(p1->val>p2->val){
res=new ListNode(p2->val);
p2=p2->next;
}else{
res=new ListNode(p1->val);
p1=p1->next;
}
ListNode* p3=res;
while(p1!=nullptr||p2!=nullptr){
if(p2!=nullptr&&(p1 == nullptr||p1->val>p2->val)){
p3->next = new ListNode(p2->val);
p2=p2->next;
}else if(p1!=nullptr&&(p2 == nullptr||p1->val<=p2->val)){
p3->next = new ListNode(p1->val);
p1=p1->next;
}
p3=p3->next;
}
return res;
}
};
结果没什么好看的,第一次只有10%,第二次到了80%,第三次到了100%