题目描述:
将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例:
输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4
这道题目有两种解决方法,第一种是暴力解决,利用两个循环将其中一个链表中的节点一个一个地插入到另一个链表中,代码如下:
/**
* 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) {
if(NULL == l1 && NULL != l2)
return l2;
if(NULL != l1 && NULL == l2)
return l1;
if(NULL == l1 && NULL == l2)
return NULL;
ListNode* l1_head = NULL;
ListNode* l2_head = NULL;
ListNode* temp1 = NULL;
ListNode* temp2 = NULL;
ListNode* prev = NULL;
ListNode* helper = NULL;
temp1 = l1;
temp2 = l2;
l1_head = l1;
l2_head = l2;
while (temp2)
{
temp1 = l1_head;
while (temp1)
{
if (temp2->val < temp1->val && temp1 == l1_head)//插入到开头
{
helper = temp2->next;
temp2->next = temp1;
l1_head = temp2;
temp2 = helper;
break;
}
if (temp1->next && temp2->val >= temp1->val && temp2->val <= temp1->next->val){
helper = temp2->next;
temp2->next = temp1->next;
temp1->next = temp2;
temp2 = helper;
break;
}else if(!temp1->next){ //插入到最后
helper = temp2->next;
temp2->next = NULL;
temp1->next = temp2;
temp2 = helper;
break;
}
temp1 = temp1->next;
}
}
return l1_head;
}
};
运行结果如下:
第二种方法是每次将l1和l2的头结点作比较,较小的拿出来用尾插法放到结果链表中,当其中一个比较完为空的时候结束循环,最后将没有比较完的那个剩余链表放到结果链表的后面。代码如下:
/**
* 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) {
if(!l1 && !l2)
return NULL;
if(l1 && !l2)
return l1;
if(!l1 && l2)
return l2;
ListNode tmpHead(INT_MIN);//建立一个临时的头结点
ListNode* ptr = &tmpHead;//ptr指向当前的节点,初始时指向头节点
while (l1 && l2)
{
if (l1->val <= l2->val)
{
ptr->next = l1;
l1 = l1->next;
}else if(l1->val > l2->val){
ptr->next = l2;
l2 = l2->next;
}
ptr = ptr->next;
}
if(l1)
ptr->next = l1;
else
ptr->next = l2;
return tmpHead.next;
}
};
运行结果如下:
第二种方法比较快!!