有序单链表合并(递归法)


只是提供思路,缺少很多边界条件的检查



/* 递归法实现有序单链表的合并 */
LinkedList *MergeRecursive(LinkedList *head1, LinkedList *head2)
{
	if (head1 == NULL)
		return head2;
	if (head2 == NULL)
		return head1;
	LinkedList *head = NULL;
	if (head1->iValue < head2->iValue)
	{
		head = head1;
		head->next = MergeRecursive(head1->next, head2);
	}
	else
	{
		head = head2;
		head->next = MergeRecursive(head1, head2->next);
	}
	return head;
}






归并排序是一种高效的排序算,其基本思想是分治,即将待排序的序列分成若干个子序列,分别进行排序,然后将有序的子序列合并成一个有序的序列。使用单链表实现归并排序的递归版本可以分为以下几个步骤: 1. **分割链表**:将链表分成两半,找到链表的中间节点。 2. **递归排序**:对分割后的两个子链表分别进行归并排序。 3. **合并链表**:将两个有序的子链表合并成一个有序的链表。 下面是一个使用单链表实现归并排序的递归版本的示例代码: ```python class ListNode: def __init__(self, val=0, next=None): self.val = val self.next = next def find_middle(head): slow, fast = head, head.next while fast and fast.next: slow = slow.next fast = fast.next.next return slow def merge_sort(head): if head is None or head.next is None: return head # 分割链表 middle = find_middle(head) right_head = middle.next middle.next = None # 递归排序左右两部分 left = merge_sort(head) right = merge_sort(right_head) # 合并排序后的两部分 return merge(left, right) def merge(l1, l2): dummy = ListNode() tail = dummy while l1 and l2: if l1.val < l2.val: tail.next = l1 l1 = l1.next else: tail.next = l2 l2 = l2.next tail = tail.next tail.next = l1 or l2 return dummy.next def print_list(head): while head: print(head.val, end=' ') head = head.next print() # 示例使用 if __name__ == "__main__": head = ListNode(38) head.next = ListNode(27) head.next.next = ListNode(43) head.next.next.next = ListNode(3) head.next.next.next.next = ListNode(9) head.next.next.next.next.next = ListNode(82) head.next.next.next.next.next.next = ListNode(10) print("Original list:") print_list(head) sorted_head = merge_sort(head) print("Sorted list:") print_list(sorted_head) ``` 这个代码定义了一个`ListNode`类来表示链表节点,`find_middle`函数用于找到链表的中间节点,`merge_sort`函数实现了归并排序的递归逻辑,`merge`函数用于合并两个有序的链表,`print_list`函数用于打印链表。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值