问题:输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则
输入:两个链表的头结点指针
输出:合并后的链表头节点指针
思路:
首先,判断两个链表是否为空链表。
然后,比较两个链表的头节点,将头节点小的节点链接到已经合并的链表后。
最后,注意判断是否有链表指向nullptr(到达链表尾部),这时,可以直接将另外一个链表链接到已经合并的链表后。
画龙点睛:创建一个dummy变量,为了在遍历完成时,利用dummy.next输出合并链表的头节点。
代码:
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};*/
class Solution {
public:
ListNode* Merge(ListNode* pHead1, ListNode* pHead2)
{
ListNode pDummy(0);
ListNode* pMerge = &pDummy;
while(pHead1!=nullptr&&pHead2!=nullptr)
{
if(pHead1->val<=pHead2->val)
{
pMerge->next=pHead1;
pMerge=pMerge->next;
pHead1=pHead1->next;
}
else
{
pMerge->next=pHead2;
pMerge=pMerge->next;
pHead2=pHead2->next;
}
}
if(pHead1==nullptr)
pMerge->next=pHead2;
else if(pHead2==nullptr)
pMerge->next=pHead1;
return pDummy.next;
}
};
复杂度分析:时间复杂度为O(n),空间复杂度为O(1)。
扩展:合并两个有序数组
代码:
class Solution {
public:
void merge(int A[], int m, int B[], int n) {
int p=m+n-1;
int i=m-1;
int j=n-1;
while(i>=0&&j>=0)
{
if(A[i]>=B[j])
{
A[p--]=A[i--];
}
else
{
A[p--]=B[j--];
}
}
while(j>=0)
A[p--]=B[j--];
}
};
合并K个有序链表 leetcode 23 hard
思路:
代码: