合并两个排序的链表

scorlw 发布于

合并两个排序的链表

关键词:链表、双指针、迭代、递归

题目描述

输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。

示例 1:

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

思路

思路一:

迭代(双指针)

定义头结点

若 l1 指向的结点值 < l2 指向的结点值,则将 l1 链接到头结点的 next 位置

否则将 l2 链接到头结点的 next 位置

循环进行,直至 l1 或 l2 为 NULL

最后,将 l1 或 l2 中剩下的部分,链接到头结点后面

思路二:

递归

编写递归的第一步,应当是明确当前函数应当完成的功能。

函数功能

返回 l1 指向的结点和 l2 指向的结点中,值较小的结点

并将从下级函数获得的返回值,链接到当前结点尾部

函数结束条件

当 l1 为空,或 l2 为空,函数结束

返回 l1 或 l2 中剩下的部分

代码

思路一:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Solution {
public:
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
ListNode* head = new ListNode(1);//随便建立一个头节点
ListNode* ret = head;
while (l1 != NULL && l2 != NULL) {
if (l1->val < l2->val) {
head->next = l1;
l1 = l1->next;
} else {
head->next = l2;
l2 = l2->next;
}
head = head->next;
}
head->next = l1 == NULL ? l2 : l1;//三目运算符的使用
return ret->next;
}
};

思路二:

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

知识点

  1. 双指针的用法
  2. 迭代和递归