题目描述:
将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例:
输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4
思路:
从链表1中取出第一个元素,记为L1,与链表2的第一个元素(记为L2)进行对比,较小的值排在新的链表的头节点,如果 L1 >= L2,将L2作为新链表的头节点,否则将L1作为新链表的头节点,然后将已操作链表的后续节点递归与另一链表进行对比
采用递归的方法:
/**
* 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) {
//如果head1 和 head2有一个为空 则直接返回另一个
if (l1==NULL) {
return l2;
}
if (l2==NULL) {
return l1;
}
ListNode *head=new ListNode(0);
//递归可以理解为之后的情况都处理好了 只需要解决好当前这步就行了
if (l1->val < l2->val) {
head=l1;
l1->next = mergeTwoLists(l1->next, l2);
}
else {
head=l2;
l2->next = mergeTwoLists(l1, l2->next);
}
return head;
}
};
没有用递归的方法:
新建一个带有哨兵结点的链表,依次比较两个有序链表的结点值,将较小值的结点插入到新链表后面。直到其中一个比较完毕,将另一个链表剩余的结点全部放到新链表最后面即可。最后,可以删除哨兵结点,或者直接返回哨兵结点后第一个结点指针
/**
* 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 *head=new ListNode(0);
ListNode *temp=head; //建立临时节点
/*开始进行比较,直到为空*/
while(l1&&l2){
if(l2->val<=l1->val){
temp->next=l2;
temp=temp->next;
l2=l2->next;
}else{
temp->next=l1;
temp=temp->next;
l1=l1->next;
}
}
//其中的一个链表比较完毕,将另外一个链表的剩余节点直接插入到新建的链表中
if(l1){
temp->next=l1;
}else
{
temp->next=l2;
}
temp=head;
head=head->next;
delete(temp); //删除指针
temp=NULL;
return head;
}
};