Leetcode328奇偶链表,Leetcode21合并两个有序链表,Leetcode206反转链表 三者综合题

题目描述

思路分析

这题的思路就和我们的标题所述一样,可以看作是这3个题的合并,但是稍微还有一点点区别

比如:奇偶链表这道题主要是偶数链在了奇数后面,字节这个的话是奇偶链表分离了

所以字节这题的大概思路就是:

将奇偶链表分离,反转偶链表,然后将反转后的偶链表和奇链表进行合并(也就是合并两个有序链表)

总体来说不是很难,思路也比较清晰,还是比较好实现的

不得不说大厂的题还是考的全面,一个题考了3个知识点

代码实现

java 复制代码
public ListNode sortLinkedList(ListNode head) {
		if(head == null || head.next == null) {
			return head;
		}
		
		// 分离链表为单索引和双索引两个子链表, 并返回链表的头节点,0 - oddHead, 1 - evenHead
		List<ListNode> heads = splitLists(head);
		
		// 反转双索引子链表(递减顺序)变为递增顺序
		ListNode reversedEven = reverse(heads.get(1));
		
		// 合并两个递增子链表
		ListNode mergedHead = mergeTwoSortedLists(heads.get(0),reversedEven);
		return mergedHead;
	}
	
	public List<ListNode> splitLists(ListNode head){
		List<ListNode> heads = new ArrayList<>();
		ListNode oddHead = new ListNode(0);
		ListNode evenHead = new ListNode(0);
		ListNode odd = oddHead;
		ListNode even = evenHead;
		ListNode cur = head;
		boolean isOdd = true;
		
		while(cur != null) {
			if(isOdd) {
				odd.next = cur;
				odd = odd.next;
			}else {
				even.next = cur;
				even = even.next;
			}
			cur = cur.next;
			isOdd = !isOdd;
		}
		
		//断开原链表的链接
		odd.next = null;
		even.next = null;
		
		heads.add(oddHead.next);
		heads.add(evenHead.next);
		return heads;
		
	}
	
	public ListNode reverse(ListNode head) {
		ListNode prev = null;
		while(head != null) {
			ListNode next = head.next;
			head.next = prev;
			prev = head;
			head = next;
		}
		return prev;
	}
	public ListNode mergeTwoSortedLists(ListNode l1, ListNode l2)  {
		ListNode dummy = new ListNode (0);
		ListNode cur = dummy;
		while(l1 != null && l2 != null) {
			if(l1.val <= l2.val) {
				cur.next = l1;
				l1 = l1.next;
			}else {
				cur.next = l2;
				l2 = l2.next;
			}
			cur = cur.next;
		}
		
		//链接剩余部分
		if(l1 != null) {
			cur.next = l1;
		}
		if(l2 != null) {
			cur.next = l2;
		}
		return dummy.next;
	}

总结

如果大家对其中的某一道题还不熟悉的话,建议去刷一下对应的题目,这里给了传送门

206. 反转链表 - 力扣(LeetCode)

21. 合并两个有序链表 - 力扣(LeetCode)

328. 奇偶链表 - 力扣(LeetCode)

相关推荐
秋风起,再归来~1 分钟前
C++从入门到起飞之——智能指针!
开发语言·c++·算法
草莓熊Lotso10 分钟前
【数据结构初阶】--二叉树(六)
c语言·数据结构·经验分享·笔记·其他
lifallen1 小时前
Disruptor高性能基石:Sequence并发优化解析
java·数据结构·后端·算法
麦兜*1 小时前
【算法】十大排序算法超深度解析,从数学原理到汇编级优化,涵盖 15个核心维度
java·汇编·jvm·算法·spring cloud·ai·排序算法
重生之我是Java开发战士1 小时前
【C语言】深度剖析指针(三):回调机制、通用排序与数组指针逻辑
c语言·开发语言·算法
zjoy_22331 小时前
[算法]Leetcode3487
java·学习·算法·leetcode
蒟蒻小袁1 小时前
力扣面试150题--只出现一次的数字II
算法·leetcode·面试
CHOTEST中图仪器1 小时前
三坐标测量机路径规划与补偿技术:如何用算法看见微米级误差?
算法·三坐标测量仪·三坐标测量机·精密测量技术
CoovallyAIHub2 小时前
数据集分享 | 稻田识别分割数据集、水稻虫害数据集
深度学习·算法·计算机视觉
朝朝又沐沐2 小时前
算法竞赛阶段二-数据结构(38)数据结构动态链表list
数据结构·算法·链表