LeetCode(21):合并两个有序链表

Easy!

题目描述:

将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 

示例:

输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4

解题思路:

具体思想就是新建一个链表,然后比较两个链表中的元素值,把较小的那个链到新链表中,由于两个输入链表的长度可能不同,所以最终会有一个链表先完成插入所有元素,则直接将另一个未完成的链表直接链入新链表的末尾。代码如下:

C++解法一:

 1 class Solution {
 2 public:
 3     ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
 4         ListNode *dummy = new ListNode(-1), *cur = dummy;
 5         while (l1 && l2) {
 6             if (l1->val < l2->val) {
 7                 cur->next = l1;
 8                 l1 = l1->next;
 9             } else {
10                 cur->next = l2;
11                 l2 = l2->next;
12             }
13             cur = cur->next;
14         }
15         cur->next = l1 ? l1 : l2;
16         return dummy->next;
17     }
18 };

下面我们来看递归的写法,当某个链表为空了,就返回另一个。然后核心还是比较当前两个节点值大小,如果l1的小,那么对于l1的下一个节点和l2调用递归函数,将返回值赋值给l1.next,然后返回l1;否则就对于l2的下一个节点和l1调用递归函数,将返回值赋值给l2.next,然后返回l2,参见代码如下:

C++解法二:

 1 class Solution {
 2 public:
 3     ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
 4         if (!l1) return l2;
 5         if (!l2) return l1;
 6         if (l1->val < l2->val) {
 7             l1->next = mergeTwoLists(l1->next, l2);
 8             return l1;
 9         } else {
10             l2->next = mergeTwoLists(l1, l2->next);
11             return l2;
12         }
13     }
14 };

下面这种递归的写法去掉了if从句,看起来更加简洁一些,但是思路并没有什么不同:

C++解法三:

 1 class Solution {
 2 public:
 3     ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
 4         if (!l1) return l2;
 5         if (!l2) return l1;
 6         ListNode *head = l1->val < l2->val ? l1 : l2;
 7         ListNode *nonhead = l1->val < l2->val ? l2 : l1;
 8         head->next = mergeTwoLists(head->next, nonhead);
 9         return head;
10     }
11 };

还可以三行搞定,简直丧心病狂有木有!

C++解法四:

1 class Solution {
2 public:
3     ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
4         if (!l1 || (l2 && l1->val > l2->val)) swap(l1, l2);
5         if (l1) l1->next = mergeTwoLists(l1->next, l2);
6         return l1;
7     }
8 };

猜你喜欢

转载自www.cnblogs.com/ariel-dreamland/p/9133521.html