剑指offer-刷题笔记-简单题-JZ25 合并两个排序的链表
思想是先对比,把两个链表合并到一起,注意最后可能会出现一个链表刚好结束,另一个链表还有剩余节点,因为链表是递增的,把,另一个链表的剩余值都链接到末尾
版本 1是自己写的,只能通过部分例子,只是对应位置单个的对比,比如{1,3,5},{2,4,6},1与2对比,3与4对比,5,6对比,比如{1,2,3},{2,4,6}就会出问题,最开始想到这个,打算用两个循环,即当前链表和下一个链表的所有节点都对比一遍,但是时间复杂度过高。版本2这里是通过只动一个节点实现的,链表1第一个节点的值较小,链接到链表1第一节点,链表1移动到第2个节点,链表2还在第一个节点,同样的可以实现多个节点的对比。最后还用了条件表达式 Exp1 ? Exp2 : Exp3;
if(pHead1->val<=pHead2->val){
cur->next=pHead1;
pHead1=pHead1->next;
}
else{
cur->next=pHead2;
pHead2=pHead2->next;
}
版本1-部分正确
class Solution {
public:
ListNode* Merge(ListNode* pHead1, ListNode* pHead2) {
ListNode* prePre = new ListNode(0);
ListNode* pre = new ListNode(0);
prePre->next = pre;
ListNode* cur1 = pHead1;
ListNode* cur2 = pHead2;
ListNode* nex1 = nullptr;
ListNode* nex2 = nullptr;
while (cur1&&cur2)
{
nex1 = cur1->next;
nex2 = cur2->next;
if(cur1->val > cur2->val)
{
pre->next = cur2;
cur2->next = cur1;
pre = cur1;
}else{
pre->next = cur1;
cur1->next = cur2;
pre = cur2;
}
cur1 = nex1;
cur2 = nex2;
}
if(cur1)
{
pre->next = cur1;
}else if(cur2)
{
pre->next = cur2;
}
return prePre->next->next;
}
};
版本2
class Solution {
public:
ListNode* Merge(ListNode* pHead1, ListNode* pHead2) {
ListNode* pHead=new ListNode(-1);
ListNode* cur=pHead;
while(pHead1&&pHead2){
if(pHead1->val<=pHead2->val){
cur->next=pHead1;
pHead1=pHead1->next;
}
else{
cur->next=pHead2;
pHead2=pHead2->next;
}
cur=cur->next;
}
cur->next=pHead1?pHead1:pHead2;
return pHead->next;
}
};