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)

相关推荐
kingmax542120081 分钟前
CCF GESP202503 Grade4-B4263 [GESP202503 四级] 荒地开垦
数据结构·算法
岁忧6 分钟前
LeetCode 高频 SQL 50 题(基础版)之 【高级字符串函数 / 正则表达式 / 子句】· 上
sql·算法·leetcode
eachin_z1 小时前
力扣刷题(第四十九天)
算法·leetcode·职场和发展
闻缺陷则喜何志丹1 小时前
【强连通分量 缩点 拓扑排序】P3387 【模板】缩点|普及+
c++·算法·拓扑排序·洛谷·强连通分量·缩点
钮钴禄·爱因斯晨1 小时前
Java 面向对象进阶之多态:从概念到实践的深度解析
java·开发语言·数据结构
机器学习之心2 小时前
机器学习用于算法交易(Matlab实现)
算法·机器学习·matlab
AL流云。2 小时前
【优选算法】C++滑动窗口
数据结构·c++·算法
qq_429879673 小时前
省略号和可变参数模板
开发语言·c++·算法
飞川撸码4 小时前
【LeetCode 热题100】网格路径类 DP 系列题:不同路径 & 最小路径和(力扣62 / 64 )(Go语言版)
算法·leetcode·golang·动态规划
Neil今天也要学习4 小时前
永磁同步电机参数辨识算法--IPMSM拓展卡尔曼滤波全参数辨识
单片机·嵌入式硬件·算法