两个链表有序 合并成一个链表

本文介绍了一种将两个有序链表合并成一个有序链表的方法,包括递归实现和非递归实现两种方式。递归实现通过比较两链表头部节点的数据来确定合并顺序;非递归实现则使用指针遍历两个链表并按序合并。这两种方法都是解决链表合并问题的有效手段。



1、递归实现

Node * Merge(Node *head1 , Node *head2)
{
if ( head1 == NULL )
return head2 ;
if ( head2 == NULL)
return head1 ;
Node *head = NULL ;
if ( head1->data < head2->data )
{
head = head1 ;
head->next = Merge(head1->next,head2);
}
else
{
head = head2 ;
head->next = Merge(head1,head2->next);
}
return head ;
}


2、非递归实现

Node * Merge(Node *head1 , Node *head2)
{
if ( head1 == NULL)
return head2 ;
if ( head2 == NULL)
return head1 ;
Node *head = NULL ;
Node *p1 = NULL;
Node *p2 = NULL;
if ( head1->data < head2->data )
{
head = head1 ;
p1 = head1->next;
p2 = head2 ;
}
else
{
head = head2 ;
p2 = head2->next ;
p1 = head1 ;
}
Node *pcurrent = head ;
while ( p1 != NULL && p2 != NULL)
{
if ( p1->data <= p2->data )
{
pcurrent->next = p1 ;
pcurrent = p1 ;
p1 = p1->next ;
}
else
{
pcurrent->next = p2 ;
pcurrent = p2 ;
p2 = p2->next ;
}
}
if ( p1 != NULL )
pcurrent->next = p1 ;
if ( p2 != NULL )
pcurrent->next = p2 ;
return head ;
}


合并两个有序链表可以通过迭代法或递归法实现。这两种方法都能将两个已排序的链表合并一个新的有序链表,且在实际应用中具有广泛的意义,例如数据库合并、文件排序等领域[^1]。 ### 迭代法 使用迭代法时,创建一个虚拟头节点,并维护一个当前指针来构建新链表。通过比较两个链表当前节点的值,选择较小的节点连接到新链表中,并更新相应的链表指针。当其中一个链表遍历完后,将剩余部分直接连接到新链表后面即可。这种方法的时间复杂度为 $O(m + n)$,其中 $m$ 和 $n$ 分别是两个链表的长度。 ```java class Solution { public ListNode mergeTwoLists(ListNode list1, ListNode list2) { ListNode ret = new ListNode(0); ListNode head = ret; while (list1 != null && list2 != null) { if (list1.val < list2.val) { ret.next = list1; ret = ret.next; list1 = list1.next; } else { ret.next = list2; ret = ret.next; list2 = list2.next; } } if (list1 == null) { ret.next = list2; } if (list2 == null) { ret.next = list1; } return head.next; } } ``` ### 递归法 递归方法则是在每次调用时选择较小的节点作为合并链表的一部分,并递归地处理下一个节点。如果其中一个链表为空,则直接返回另一个链表。这种方式同样能够保证最终结果是一个有序链表[^2]。 ```java public class Solution { public ListNode mergeTwoLists(ListNode l1, ListNode l2) { // 如果其中一个链表为空,则返回另一个链表 if (l1 == null) { return l2; } if (l2 == null) { return l1; } // 比较两个链表当前节点的值 if (l1.val < l2.val) { // 将值较小的节点作为合并链表的一部分 l1.next = mergeTwoLists(l1.next, l2); return l1; } else { l2.next = mergeTwoLists(l1, l2.next); return l2; } } } ``` ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值