合并两个有序列表
合并两个有序列表
问题重述:
问题分析:
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例 1:
输入:l1 = [1,2,4], l2 = [1,3,4]
输出:[1,1,2,3,4,4]
示例 2:
输入:l1 = [], l2 = []
输出:[]
示例 3:
输入:l1 = [], l2 = [0]
输出:[0]
解法:
迭代
解题:
代码:
public ListNode mergeTwoLists(ListNode list1, ListNode list2) {
// 特殊情况
if(list1 == null){
return (list2 == null ? null : list2);
}
if(list2 == null){
return (list1 == null ? null : list1);
}
// 创建一个假节点便于操作头节点
ListNode head = new ListNode(-1);
ListNode newCur = head;
while(list1 != null && list2 != null){
if(list1.val >= list2.val){
newCur.next = list2;
list2 = list2.next;
}else{
newCur.next = list1;
list1 = list1.next;
}
newCur = newCur.next;
}
newCur.next = (list1 == null ? list2 : list1);
return head.next;
}
代码解析:对两个链表分别从头开始遍历,对两个结点的值进行比较,将较小的结点添加到新链表中去,最后循环退出,最多还有一个链表不为空,因为已经是排好序了的,直接将这个链表连接到新链表最后即可。
public ListNode mergeTwoLists(ListNode list1, ListNode list2) {
if(list1 == null){
return (list2 == null ? null : list2);
}
if(list2 == null){
return (list1 == null ? null : list1);
}
// 首先判断当前的头节点
ListNode head = (list1.val <= list2.val ? list1 : list2);
ListNode cur1 = (list1 == head ? list1 : list2);
ListNode cur2 = (list1 == head ? list2 : list1);
ListNode pre = null;
ListNode next = null;
while(cur1 != null && cur2 != null){
if(cur1.val <= cur2.val){
pre = cur1;
cur1 = cur1.next;
}else{
next = cur2.next;
pre.next = cur2;
cur2.next = cur1;
pre = cur2;
cur2 = next;
}
}
pre.next = (cur1 == null ? cur2 : cur1);
return head;
}
代码解析:这个方法是将两个链表串起来,而不是使用新的链表将结点一个一个连起来,这里一般的处理方式是直接对两个链表分别遍历,每次比较完成后,结点插入的条件是大于前一个结点,小于后一个结点,这样子最后会报空指针异常,因此我们不能这样左。这里我们使用了一个新节点pre用于存储上一次比较的较小值,如果这一次比较中,head所在的链表l1中的值大于另一条链表l2所对应的结点的值,那么这个结点大于l1前一个结点,小于l1后一个结点,此时可以将这个结点加入l1链表中。(next结点用来保存l2对应结点的下一个结点,因为l2对应结点被加入到l1中去了)。最后循环结束后,将不为空的链表添加到pre之后,就将两个链表完全合并了。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律