输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则
题目来源:牛客网
https://www.nowcoder.com/questionTerminal/d8b6b4358f774294a89de2a6ac4d9337
非递归思路
如果其中有一个链表为空,则返回另一个链表(包括两个都为空时,直接返回空)
创建两个指针,p 和 tail(其中tail用来表示p的尾)
访问两个链表的第一个首元素,将值最小的那个赋值给p和tail,然后较小的那个链表指针下移一位。
当两个链表同时不为空时,遍历两个两个链表,并作以下操作:
把两个链表中元素较小的那个节点链接到tail的后面,
将该节点后移一位
并将tail后移一位
当有剩余链表时,遍历剩余部分,并将其加入到tail的后面
整个合并排序结束,并且没有多余节点和链表生成。
/*
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)
return pHead2;
if(!pHead2)
return pHead1;
//借助两个新的指针,tail为p的尾
ListNode* p = NULL;
ListNode* tail = NULL;
//将两个链表中最小的首元素赋值给p和tail
if(pHead1->val >= pHead2->val)
{
p = tail = pHead2;
pHead2 = pHead2->next;
}else{
p = tail = pHead1;
pHead1 = pHead1->next;
}
//对两个链表进行遍历
while(pHead1 && pHead2)
{
//将当前两个链表中的最小值链接到tail的尾
if(pHead1->val >= pHead2->val)
{
tail->next = pHead2;
//将已经链接到tail后的节点指针下移一位
pHead2 = pHead2->next;
}else{
tail->next = pHead1;
pHead1 = pHead1->next;
}
//tail还是指向链表最尾端
tail = tail->next;
}
//对剩余的节点做处理(剩下的全部都插入尾端)
ListNode* t = pHead1?pHead1:pHead2;
while(t)
{
tail->next = t;
tail = tail->next;
t = t->next;
}
return p;
}
};