题解 | #合并两个排序的链表#
合并两个排序的链表
https://www.nowcoder.com/practice/d8b6b4358f774294a89de2a6ac4d9337
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};*/
class Solution {
public:
ListNode* Merge(ListNode* pHead1, ListNode* pHead2)
{
if(pHead1==nullptr||pHead2==nullptr)
{
return pHead1==nullptr?pHead2:pHead1;
}
else
{
ListNode* L1,* L2,* s;
ListNode* head;
L1=pHead1;
L2=pHead2;//双指针
if(L1->val<L2->val)
{
s=L1;
L1=L1->next;
}
else
{
s=L2;
L2=L2->next;
}
head=s;//以小的为起始
while(L1!=nullptr||L2!=nullptr)//进行连接
{
if(L1==nullptr)
{
s->next=L2;
L2=nullptr;
break;
}
else if(L2==nullptr)
{
s->next=L1;
L1=nullptr;
break;
}
else
{
if(L1->val<=L2->val)
{
s->next=L1;
s=s->next;
L1=L1->next;
}
else
{
s->next=L2;
s=s->next;
L2=L2->next;
}
}
}
return head;
}
}
};
此代码也适用于不等长链表合并
基本思路是设置游标L1在链表pHead1上移动,设置游标L2在链表pHead2上移动,s在合并链表head(为头)上移动
注意s在移动前必须先连接到除开已在pHead中结点外的最小结点上,当s到nullptr表明head已经连接完毕
如果制定以下规则
1.起始时L1,L2指向各自头结点,
2.当S移动到L1(L2时)L1(L2)向后移动一位,
那么在每次S即将连接下一个结点时,下一个结点必为L1,L2所指结点值较小的一个。
查看18道真题和解析