[LeetCode]21. Merge Two Sorted Lists 解题报告(C++)
题目描述
Merge two sorted linked lists and return it as a new list. The new list should be made by splicing together the nodes of the first two lists.
Example:
Input: 1->2->4, 1->3->4
Output: 1->1->2->3->4->4
题目大意
- 将两个已经排序的链表合并到一起.返回一个有序新链表
解题思路
方法1:
- 由于单链表不能通过索引访问.
- 开辟一个新的空间作为表头.
- 通过遍历两个链表进行比较添加至表尾.
代码实现:
class Solution {
public:
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
ListNode*head= (ListNode*)malloc(sizeof(ListNode));
ListNode*p = head;
while (l1&&l2){
if (l1->val < l2->val) {
head->next = l1;
head = head->next;
l1 = l1->next;
}
else
{
head->next = l2;
head = head->next;
l2 = l2->next;
}
}
while (l1) {
head->next = l1;
head = head->next;
l1 = l1->next;
}
while (l2) {
head->next = l2;
head = head->next;
l2 = l2->next;
}
return p->next;
}
};
// 简洁写法:
class Solution {
public:
ListNode* mergeTwoLists0(ListNode* l1, ListNode* l2) {
ListNode*head = (ListNode*)malloc(sizeof(ListNode));
ListNode*p = head;
while (l1&&l2) {
if (l1->val < l2->val) {
p->next = l1;
l1 = l1->next;
}
else {
p->next = l2;
l2 = l2->next;
}
p = p->next;
}
p->next = l1 ? l1 : l2;
return head->next;
}
};
方法2:
- 递归写法.
- 当某个链表为空.就返回另一个.
- 核心依旧是比较当前两个节点的大小.
- 若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;
}
}
};
// 去掉了条件判断
class Solution {
public:
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
if (!l1) return l2;
if (!l2) return l1;
ListNode *head = l1->val < l2->val ? l1 : l2;
ListNode *nonhead = l1->val < l2->val ? l2 : l1;
head->next = mergeTwoLists(head->next, nonhead);
return head;
}
};
方法3:
- 三行代码.
- 太优秀了!
代码实现:
class Solution {
public:
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
if (!l1 || (l2 && l1->val > l2->val)) swap(l1, l2);
if (l1) l1->next = mergeTwoLists(l1->next, l2);
return l1;
}
};