(一)题目要求:
将两个排序链表合并为一个新的排序链表
(二)示例:
给出 1->3->8->11->15->null
,2->null
, 返回 1->2->3->8->11->15->null
(三)题解:
方法一:
/**
* Definition of ListNode
* class ListNode {
* public:
* int val;
* ListNode *next;
* ListNode(int val) {
* this->val = val;
* this->next = NULL;
* }
* }
*/
//方法一:
//遍历l2链表,将链表每个结点逐个插入l1链表
//(1)保存l2下一个要插入结点的指针
//(2)l1指针后移,找到l2当前结点插入位置
//(3)插入结点
//(4)l1指向最后一个结点,l2置为下一个插入结点
class Solution {
public:
/*
* @param l1: ListNode l1 is the head of the linked list
* @param l2: ListNode l2 is the head of the linked list
* @return: ListNode head of linked list
*/
ListNode * mergeTwoLists(ListNode * l1, ListNode * l2) {
// write your code here
if(!l1)
return l2;
ListNode Dummy(0);
Dummy.next = l1;
l1 = &Dummy;
while(l2)
{
ListNode *next_insert = l2->next;
while(l1->next && l2->val > l1->next->val)
l1 = l1->next;
//如果l1链表已到链表尾部,则l2链表无需逐个插入,l1指向l2当前结点即可
/* if(!l1->next)
{
l1->next = l2;
break;
} */
l2->next = l1->next;
l1->next = l2;
l1 = l1->next;
l2 = next_insert;
}
return Dummy.next;
}
};
方法二:
//方法二:
//归并排序法
class Solution {
public:
/*
题意:合并两个有序链表
模拟一轮归并排序
*/
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
ListNode *dummy = new ListNode(0);
ListNode *tmp = dummy;
while (l1 != NULL && l2 != NULL) {
if (l1->val < l2->val) {
tmp->next = l1;
l1 = l1->next;
} else {
tmp->next = l2;
l2 = l2->next;
}
tmp = tmp->next;
}
//将剩余为插入元素插入新的排序链表
if (l1 != NULL) tmp->next = l1;
else tmp->next = l2;
return dummy->next;
}
};