题目描述
输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。
题目来源: 牛客网
思路:
整体思路而言, 就是双指针, 把每一个节点的值拿出来与要插入的链表比较, 也用到插入排序的一个思路, 只是将数组换成了链表
最重要的是, 我们要插入一个节点就要注意相关节点的断链和链接
具体的操作流程见代码及代码注释
代码示例:
/*
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 pHead2;
if (pHead1 != nullptr && pHead2 == nullptr)
return pHead1;
if (pHead1 == nullptr && pHead2 == nullptr)
return nullptr;
//双指针
ListNode* p1 = pHead1;
ListNode* p2 = pHead2;
ListNode* tmp1 = nullptr;
while (p1 != nullptr && p2 != nullptr)
{
//把pHead2所指向的链表中的每个节点拿出来与pHead1所指向的链表比较
//当p2->val >= p1->val时, 找到插入位置, 此时要插入的位置是p1的上一个节点, 因此 需要tmp保存p1的上一个节点
while (p1 != nullptr && (p2->val >= p1->val))
{
tmp1 = p1;
p1 = p1->next;
}
//这里的条件判断是为了防止 pHead2->val < pHead1->val
if (tmp1 != nullptr)
{
tmp1->next = p2;
//这里是为了防止pHead2所指向的链表中连续出现相等的值, 因此不更新tmp1的值为插入之后的节点p2的话, 就把把具有相同值的节点插在同一个节点之后, 出现数据丢失
tmp1 = p2;
}
//从pHead2中拿出要插入的节点时, 要保存该节点的下一个节点, 不然下次循环就找不到pHead2中的节点了
ListNode* tmp2 = p2->next;
//这里的条件判断是防止pHead1的长度大于pHead2的长度
if (tmp2 == nullptr)
{
p2->next = p1;
break;
}
//这里的条件判断是防止pHead2的长度大于pHead1的长度
if (p1 != nullptr)
p2->next = p1;
else
p2->next = tmp2;
p2 = tmp2;
}
//返回值为链表头
return (pHead1->val <= pHead2->val) ? pHead1 : pHead2;
}
};