合并两个有序列表

合并两个有序列表

问题重述:

问题分析:

将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。

示例 1:

img

输入: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之后,就将两个链表完全合并了。

posted @   foldn  阅读(185)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示