面试算法题. 单向链表奇偶节点拆分与排序. 链表的基本操作

本文介绍了一种链表操作算法,首先将链表的奇数节点和偶数节点进行拆分,然后对偶数节点链表进行逆序处理,最后将两个链表合并。文章详细解释了链表节点结构、链表反转、链表合并以及奇偶拆分的具体实现过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

思路:

  1. 将奇偶节点拆分
  2. 降序链表反转
  3. 两个有序链表合并 
// 链表节点结构
struct ListNode {
	ListNode(int a = 0) : val(a), 
			next(nullptr) {
	}

	int val;
	ListNode* next;
};


// 递归版本的链表反转
ListNode* ReverseList(ListNode* head) {

	if (nullptr == head)
		return nullptr;

	if (nullptr == head->next)
		return head;

	ListNode* newHead = ReverseList(head->next);
	head->next->next = head;
	head->next = nullptr;

	return newHead;
}

// 合并两个有序链表
ListNode* mergeList(ListNode* l1, ListNode* l2) {

	if (nullptr == l1)
		return l2;

	if (nullptr == l2)
		return l1;

	ListNode* newhead = new ListNode(0);
	ListNode*next = newhead;

	while (nullptr != l1 && nullptr != l2) {

		if (l1->val <= l2->val) {

			next->next = l1;
			l1 = l1->next;
		}
		else {
			next->next = l2;
			l2 = l2->next;
		}
		next = next->next;
	}

	next->next = nullptr != l1 ? l1 : l2;
	ListNode* p = newhead;
	delete p;// 需要释放开辟的临时内存

	newhead = newhead->next;
	return newhead;
}

// 链表的奇偶拆分,头节点指定为1,为奇数节点
// 这里假定奇数为升序,偶数为降序
ListNode* SplitList(ListNode* head) {

	if (nullptr == head)
		return head;

	// 奇偶链表分离
	ListNode *h1 = head;
	ListNode *h2 = head->next;
	ListNode *p2 = h2;

	while (nullptr != h1 && nullptr != h2) {

		h1->next = h2->next;
		h1 = h1->next;
		h2->next = nullptr != h1 ? h1->next : nullptr;
		h2 = h2->next;
	}

	h1 = head;
	h2 = p2;

	// 对偶数链表做一个逆序
	h2 = ReverseList(h2);

	// 最后对两个升序链表进行一个合并
	return mergeList(h1, h2);
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值