题目描述:
合并两个有序单链表,使得最终的链表也是递增的。
节点的结构
typedef struct ListNode
{
ListNode* _next;
int _data;
}Node;
递归:
Node* MergeListR(Node* Head1,Node* Head2)
{
if(NULL == Head1 || NULL == Head2){
if(NULL == Head1)
return Head2;
return Head1;
}
Node* newHead = NULL;
//较小的作为新链表的头
if(Head1->_data < Head2->_data){
newHead = Head1;
newHead->_next = MergeList(newHead->_next,Head2);
}else{
newHead = Head2;
newHead->_next = MergeList(Head1,newHead->_next);
}
return newHead;
}
非递归实现:
思路:
- 先选取较小的作为新链表的头
- 依次比较两个链表的大小,选出小的链到新链表的后面
- 当一个链表走完,另一个没走完时,直接链到新链表的后面
代码:
Node* MergeTwoListR(Node* Head1,Node* Head2)
{
if(Head1 == NULL)
return Head2;
if(Head2 == NULL)
return Head1;
Node* node1 = Head1;
Node* node2 = Head2;
//合并后新链表的头
Node* newHead = NULL;
//较小的作为头节点
if(node1->_data <= node2->_data){
newHead = node1;
node1 = node1->_next;
}else{
newHead = node2;
node2 = node2->_next;
}
//让newHead一直指向新链表的头作为返回值
Node* cur = newHead;
while(node1 != NULL && node2 != NULL){
if(node1->_data <= node2->_data){
cur->_next = node1;
node1 = node1->_next;
cur = cur->_next;
}else{
cur->_next = node2;
node2 = node2->_next;
cur = cur->_next;
}
}
//如果node1没结束
if(node1 != NULL){
cur->_next = node1;
}
//如果node2没结束
if(node2 != NULL){
cur->_next = node2;
}
return newHead;
}
文中的代码为手打,并非复制粘贴,所以如有错误,还请指正,第一时间回复。