合并两个有序链表(简单)
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例
输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4
解题
这个题很简单,定义两个指针分别指向两个链表,然后比较这两个值,把小的插入到新链表中,然让指针向右挪动一个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 *p=l1,*q=l2;
ListNode *res=new ListNode(-1), *cur = res;;
if(p==NULL) return q;
if(q==NULL) return p;
while(p && q){
if(p->val<=q->val){
cur->next=p;
p=p->next;
}
else {
cur->next=q;
q=q->next;
}
cur=cur->next;
}
cur->next=p?p:q;
return res->next;
}
};
另外,这道题还可以用递归的思想去做:当某个链表为空了,就返回另一个。然后核心还是比较当前两个节点值大小,如果 l1 的小,那么对于 l1 的下一个节点和 l2 调用递归函数,将返回值赋值给 l1.next,然后返回 l1;否则就对于 l2 的下一个节点和 l1 调用递归函数,将返回值赋值给 l2.next,然后返回 l2,参见代码如下:
class Solution {
public:
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
if (!l1) return l2;
if (!l2) return l1;
if (l1->val < l2->val) {
l1->next = mergeTwoLists(l1->next, l2);
return l1;
} else {
l2->next = mergeTwoLists(l1, l2->next);
return l2;
}
}
};