链接
牛客OJ:合并两个排序的链表
九度OJ:http://ac.jobdu.com/problem.php?pid=1519
GitHub代码: 017-合并两个排序的链表
CSDN题解:剑指Offer–017-合并两个排序的链表
牛客OJ | 九度OJ | CSDN题解 | GitHub代码 |
---|
合并两个排序的链表 | 1519-合并两个排序的链表 | 剑指Offer–017-合并两个排序的链表 | 017-合并两个排序的链表 |
您也可以选择回到目录-剑指Offer–题集目录索引
其实这道题跟LeetCode上一道题是一样的
LeetCodet题解–21. Merge Two Sorted Lists(合并两个排序好的链表)
当然他还有很多变种,比如说两个链表扩展成为K个的时候
LeetCodet题解–23. Merge k Sorted Lists(合并K个已排序的链表)
题意
题目描述
输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。
样例输入
1 3 5 7 9
2 4
样例输出
1 2 3 4 5 7 9
常规写法
思路很简单,用两个指针同步遍历两个链表,每次找到小的那个插入到新的链表中
#include using namespace std;
#define __tmain main#ifdef __tmain#define debug cout#else#define debug 0 && cout#endif #ifdef __tmain
struct ListNode
{
public :int val;struct ListNode *next;
};#endif class Solution
{
public:ListNode* Merge(ListNode *pLeft, ListNode *pRight){if(pLeft &#61;&#61; NULL){debug <<"left list is NULL" <return pRight;}else if(pRight &#61;&#61; NULL){debug <<"right list is NULL" <return pLeft;}ListNode *left &#61; pLeft;ListNode *right &#61; pRight;ListNode *head &#61; NULL;if(left->val val){head &#61; left;left &#61; left->next;debug "in list" <else{head &#61; right;right &#61; right->next;debug "in list" <
递归实现
其实思路一样&#xff0c;只是由于每次添加节点&#xff0c;都是机械性地重复工作&#xff0c;因此可以用递归来实现
class Solution
{
public:ListNode* Merge(ListNode *pLeft, ListNode *pRight){if(pLeft &#61;&#61; NULL){debug <<"left list is NULL" <return pRight;}else if(pRight &#61;&#61; NULL){debug <<"right list is NULL" <return pLeft;}ListNode *head &#61; NULL;if(pLeft->val val){head &#61; pLeft;head->next &#61; Merge(pLeft->next, pRight);}else{head &#61; pRight;head->next &#61; Merge(pLeft, pRight->next);}return head;}
};