输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。
思路:
常见的思路:
- 另创一个head,然后从头到尾一直比较,取小的接到head后面,循环比较。
- 选取一个链表当做模板,遍历另外一个,一个个比较,然后插进去,相当于选择插入排序。
自己的思路,和其他差不多,只是稍微改造了一下。(注:VS2019通过,且结论正确,但是牛客一直说数组越界。)就用图表示了:
代码:
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};*/
class Solution {
public:
ListNode* Merge(ListNode* pHead1, ListNode* pHead2)
{
ListNode* p1 = pHead1;
ListNode* p2 = pHead2;
ListNode* p1_fllow = pHead1, * p2_fllow = pHead2;
bool b2Big = true;
if(p2->val >= p1->val)
b2Big = true;
else
b2Big = false;
bool resutlBegin = b2Big;
while(p1 != NULL && p2 != NULL)
{
//上一步是p1>p2 这一步还是p1 > p2
if(p1->val > p2->val && !b2Big)
{
p2_fllow = p2;
p2 = p2->next;
}//上一步是p1 < p2 ,这一步还是p1<p2
else if (p1->val <= p2->val && b2Big)
{
p1_fllow = p1;
p1 = p1->next;
}//上一步p1 < p2 ,这一步p1 > p2
else if(p1->val > p2->val && b2Big)
{
p1_fllow->next = p2;
p2_fllow = p2;
p2 = p2->next;
b2Big = false;
}//上一步p1 > p2 ,这一步p1<p2;
else if(p1->val <= p2->val && !b2Big)
{
p2_fllow->next = p1;
p1_fllow = p1;
p1 = p1->next;
b2Big = true;
}
}
if (b2Big)//p2 > p1
p1_fllow->next = p2;
else
p2_fllow->next = p1;
delete p1,p2,p1_fllow,p2_fllow;
p1 = NULL;
p2 = NULL;
p2_fllow = NULL;
p1_fllow = NULL;
if(resutlBegin)//p2 > p1
return pHead1;
else
return pHead2;
}
};