Sword25——合并两个排序的链表

Sword25——合并两个排序的链表

方法1——哑铃节点

  • 思路:因为是两个有序的链表,可以采取类似于归并排序的思想,首先定义新链表的哑铃节点,依次遍历两个链表中节点,将较小的节点加入新链表中,并后移,直到两个链表合并完毕
  • 特殊情况与临界分析:无
  • 终止条件:两链表合并完毕
  • 步骤:
    • 定义新链表的哑铃节点
    • 定义记录新链表的末尾节点
    • 循环条件:l1且l2不为空
    • while循环
      • 当l1对应节点值小于l2时
        • 新链表末尾节点的next指向l1
        • l1后移
        • 末尾节点后移(公共部分抽取成一个步骤)
      • 当l1对应节点值大于等于l2时
        • 新链表末尾节点的next指向l2
        • l2后移
        • 末尾节点后移(公共部分抽取成一个步骤)
      • 末尾节点后移(两个判断都要执行此步骤)
    • 退出循环时,代表链表一方为空,因此将另一方不为空的后续拼接在末尾节点后面即可
    • 返回哑铃节点的下一节点,即新链表的头节点
    public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
        // 定义哑铃节点
        ListNode dummy = new ListNode(-1);
        // 定义末尾节点
        ListNode end = dummy;
        // while循环
        while (l1 != null && l2 != null) {
            // 当l1的值小于l2时
            if (l1.val < l2.val) {
                // end的next指向l1
                end.next = l1;
                // l1后移
                l1 = l1.next;
            // 当l1的值大于等于l2时
            } else {
                // end的next指向l2
                end.next = l2;
                // l2后移
                l2 = l2.next;
            }
            // end后移
            end = end.next;
        }
        // 此时两个链表中有一个已到末尾,只需将非空的链表后续部分拼接在末尾节点
        end.next = l1 == null ? l2 : l1;
        // 返回哑铃节点的下一节点,即新链表的头节点
        return dummy.next;
    }

方法1——哑铃节点

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值