leetcode 21.合并两个有序链表

leetcode 21.合并两个有序链表

题目描述:

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

迭代法:

思路: 不断迭代,谁小指向谁

   public ListNode mergeTwoLists(ListNode list1, ListNode list2) {
        if (list1== null) {
            return list2;
        }
        if (list2== null) {
            return list1;
        }
        //虚拟节点/哨兵节点,后面会指向合并后的链表。可以更容易地返回合并后的链表
        ListNode prehead = new ListNode();
        ListNode listNode = prehead;

        //遍历,谁小指向谁
        while (list1!=null && list2!=null) {
            if (list1.val < list2.val) {
                listNode.next = list1;
                //已经合并的,就向后迭代
                list1 = list1.next;
            } else {
                listNode.next = list2;
                list2 = list2.next;
            }
            //向后迭代,不然合并后的节点只有第一个有值。
            listNode = listNode.next;
        } 
        //一个链表遍历完了,另外一个链表还有未合并完的部分,也要合并进结果里面。
        if (list1 == null) {
            listNode.next = list2;    
        } else {
            listNode.next = list1;    
        }

        return prehead.next;
}

递归法

思路: 判断 l1 和 l2 哪一个链表的头节点的值更小,然后递归地决定下一个添加到结果里的节点。

    public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
        if (l1 == null) {
            return l2;
        } else if (l2 == null) {
            return l1;
        } else if (l1.val < l2.val) {
           //自顶向下。
           //由于 l1的节点值比较小,所以需要合并到结果集中。
           // l1指向的next 节点是合并后的节点,l1.next 和 l2 是下一次参与递归的节点
            l1.next = mergeTwoLists(l1.next, l2);
			
		//注意:返回 mergeTwoLists(l1, l2) 的结果,哪个值小就返回哪个值,这里别漏了
            return l1;
        } else {
            l2.next = mergeTwoLists(l1, l2.next);
            return l2;
        }
    }

posted on   乐之者v  阅读(7)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

导航

统计

点击右上角即可分享
微信分享提示