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)

相关推荐
WWZZ202516 分钟前
快速上手大模型:机器学习6(过拟合、正则化)
人工智能·算法·机器学习·计算机视觉·机器人·slam·具身感知
ceclar12325 分钟前
C++Lambda表达式
开发语言·c++·算法
当战神遇到编程26 分钟前
链表的概念和单向链表的实现
数据结构·链表
2401_8414956433 分钟前
【强化学习】动态规划算法
人工智能·python·算法·动态规划·强化学习·策略迭代·价值迭代
WWZZ202534 分钟前
快速上手大模型:机器学习5(逻辑回归及其代价函数)
人工智能·算法·机器学习·计算机视觉·机器人·slam·具身感知
DuHz1 小时前
基于频率分集阵列的MIMO雷达联合距离角度估计——论文阅读
论文阅读·算法·汽车·信息与通信·毫米波雷达
INGNIGHT1 小时前
单词搜索 II · Word Search II
数据结构·c++·算法
黄卷青灯771 小时前
标定系数为什么会存储在相机模组里面,在标定的时候,算法是在割草机的X3板上运行的啊?
数码相机·算法·相机内参
螺丝钉的扭矩一瞬间产生高能蛋白2 小时前
PID算法基础知识
算法
HVACoder3 小时前
复习下线性代数,使用向量平移拼接两段线
c++·线性代数·算法