合并两个排序的链表
关键词:链表、双指针、迭代、递归
题目描述
输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。
示例 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; } };
|
知识点
- 双指针的用法
- 迭代和递归