算法-leetcode-链表问题- 21. 合并两个有序链表

14, 21. 合并两个有序链表

https://leetcode-cn.com/problems/merge-two-sorted-lists/

思路1:迭代

思路2: 递归

package com.shangguigu.dachang.algrithm.A05_linkedList;

/**
 * @author : 不二
 * @date : 2022/4/11-下午2:35
 * @desc : 21. 合并两个有序链表
 *
 **/
public class A49_mergeTwoLists {
    public static void main(String[] args) {
        ListNode l11 = new ListNode(1);
        ListNode l12 = new ListNode(2);
        ListNode l13 = new ListNode(4);
        l11.next = l12;
        l12.next = l13;

        ListNode l21 = new ListNode(1);
        ListNode l22 = new ListNode(3);
        ListNode l23 = new ListNode(4);
        l21.next = l22;
        l22.next = l23;

//        ListNode listNode = mergeTwoLists(l11, l21);
        ListNode listNode = mergeTwoLists_v2(l11, l21);
        System.out.println("结果是:" + listNode);

    }

    /**
     * 思路1:递归法
     * 这个每怎么理解上,道理知道,但是不怎么想得通
     */
    public static ListNode mergeTwoLists_v2(ListNode list1, ListNode list2){
        if (list1 == null) {
            return list2;
        }
        if (list2 == null) {
            return list1;
        }

        // 比较头节点
        if (list1.val <= list2.val) {
            list1.next = mergeTwoLists_v2(list1.next, list2);
            return list1;
        } else {
            list2.next = mergeTwoLists_v2(list1, list2.next);
            return list2;
        }
    }


    /**
     * 思路1:迭代法
     */
    public static ListNode mergeTwoLists(ListNode list1, ListNode list2) {

        ListNode l1Pointer = list1;
        ListNode l2Pointer = list2;


        ListNode sentinal = new ListNode(Integer.MIN_VALUE);
        ListNode preNode = sentinal;

        // 遍历第一个链表
        while (l1Pointer != null && l2Pointer != null) {
            // 这里说明链表1指针指向的比较小
            if (l1Pointer.val <= l2Pointer.val) {
                // 如果preNode是MIN_VALUE,则说明和头部相同
                /*if (preNode.val == Integer.MIN_VALUE) {
                    // 说明一个节点都还没有关联上
                    // 把头部指向指针位置
                    sentinal.next = l1Pointer;
                    // 然后preNode指向指针位置,方便后续使用preNode接着指向下一个比较小的node
                    preNode = l1Pointer;
                } else {
                    // 走到这里,说明哨兵节点已经就位,这里只处理preNode节点即可
                    preNode.next = l1Pointer;
                    preNode = l1Pointer;
                }*/
                // System.out.println("----");

                // 其实不用在乎是不是哨兵节点,这里只处理preNode节点即可(因为默认preNode和哨兵节点是同一个)
                preNode.next = l1Pointer;
                preNode = l1Pointer;

                // 小的指针往后移动
                l1Pointer = l1Pointer.next;
            } else {
                /*if (preNode.val == Integer.MIN_VALUE) {
                    // 说明一个节点都还没有关联上
                    sentinal.next = l2Pointer;
                    preNode = l2Pointer;
                } else {
                    preNode.next = l2Pointer;
                    preNode = l2Pointer;
                }*/

                preNode.next = l2Pointer;
                preNode = l2Pointer;

                // 小的指针往后移动
                l2Pointer = l2Pointer.next;
            }
        }

        // 走到这里,说明肯定有一个链表已经走完。没有走完的链表直接放在后面即可
        if (l1Pointer != null) {
            preNode.next = l1Pointer;
        }

        // 走到这里,说明肯定有一个链表已经走完。没有走完的链表直接放在后面即可
        if (l2Pointer != null) {
            preNode.next = l2Pointer;
        }
        return sentinal.next;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值