//合并两个有序链表
ListNode* mergeTwoLists(ListNode* list1, ListNode* list2)
{
ListNode*p=_dummyHead; //p指向虚头节点
while(list1 && list2)
{
//比较两链表找出最小值,
if(list1->val<list2->val)
{
p->next=list1;//p指向值较小的链表,
list1=list1->next;//值较小的链表向后移动,为下次和大的链表比较
}
else
{
p->next=list2;
list2=list2->next;
}
p=p->next;//指针p移动到值小的链表的下个位置
}
p->next=list1==nullptr?list2:list1;//当退出循环时,表示两链表有到链尾了,就把剩下的节点连起来
return _dummyHead->next;
}
测试代码:
/*************************************************************************
> File Name: 12-合并两个有序链表.cpp
> Author:
> Mail:
> Created Time: Tue 29 Mar 2022 07:57:06 PM CST
思路:比较两链表的值,找出值小的链表,让指针p指向该节点,之后移动p指针所指向的链表节点,该节点和两个链表的值比较,循环操作
************************************************************************/
#include<iostream>
using namespace std;
class Solution
{
public:
struct ListNode
{
int val;
struct ListNode*next;
ListNode(int val):val(val),next(nullptr){}
};
//1. 在链表最前面插入一个节点,插入完成后,新插入的节点为链表的新的头结点
ListNode*addAtHead(int val)
{
ListNode* newNode = new ListNode(val);
newNode->next = _dummyHead->next;
_dummyHead->next = newNode;
return _dummyHead->next;
}
//尾插法
ListNode*addeare(int val)
{
ListNode* newNode = new ListNode(val);
ListNode* pre=_dummyHead;
while(pre->next!=nullptr)
{
pre=pre->next;
}
//退出循环说明pre的下个位置为空,即链表队尾
pre->next=newNode;
return _dummyHead->next;//返回头
}
// 2.打印链表
void printLinkedList()
{
ListNode* cur = _dummyHead;
while (cur->next != nullptr)
{
cout << cur->next->val << " ";
cur = cur->next;
}
cout << endl;
}
//合并两个有序链表
ListNode* mergeTwoLists(ListNode* list1, ListNode* list2)
{
ListNode*p=_dummyHead; //p指向虚头节点
while(list1 && list2)
{
//比较两链表找出最小值,
if(list1->val<list2->val)
{
p->next=list1;//p指向值较小的链表,
list1=list1->next;//值较小的链表向后移动,为下次和大的链表比较
}
else
{
p->next=list2;
list2=list2->next;
}
p=p->next;//指针p移动到值小的链表的下个位置
}
p->next=list1==nullptr?list2:list1;//当退出循环时,表示两链表有到链尾了,就把剩下的节点连起来
return _dummyHead->next;
}
ListNode* _dummyHead= new ListNode(0);
};
int main()
{
// //输入:1 4 3 2 5 2 x=3;
// //输出:1 2 3 4 3 5
Solution s,s1;
s.addeare(1);
s.addeare(2);
s.addeare(3);
s.addeare(4);
s.addeare(5);
Solution::ListNode*l1=s.addeare(6);
s.printLinkedList();//打印l1数据
s1.addeare(0);
s1.addeare(2);
s1.addeare(3);
Solution::ListNode*l2=s1.addeare(4);
s1.printLinkedList();//打印l2数据
Solution::ListNode*l3=s1.mergeTwoLists(l1,l2);
s1.printLinkedList();//打印合并后数据
return 0;
}