链表---合并两个有序链表

记录链表的题

力扣题目链接 : https://leetcode.cn/problems/merge-two-sorted-lists/

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

示例1:
请添加图片描述

输入:l1 = [1,2,4], l2 = [1,3,4]
输出:[1,1,2,3,4,4]

示例2:

输入:l1 = [], l2 = []
输出:[]

示例3:

输入:l1 = [], l2 = [0]
输出:[0]

提示:

  • 两个链表的节点数目范围是 [0, 50]
  • -100 <= Node.val <= 100
  • l1 和 l2 均按 非递减顺序 排列

思路:

两个有序的链表合并其实思路很简单,我们比较两个链表的值,如果第一个链表节点的值大于第二个链表节点的的值,那么就将第一个链表的指针指向第二个链表的节点,相反,则第一个链表向下跳一个即可。

  • 我们首先要判断链表是否是null,判断边界条件很重要
 if(head1 == null || head2 == null){
        return head1 == null ? head2 : head1;   // 返回其中一个链表
   }
  • 我们是不是还得知道那个链表做头啊,那个链表的头部的值最小,那个就做小头
 ListNode head = head1.val <= head2.val ? head1 : head2;
  • 然后我们需要定义三个节点,分别用来指向小头的下一个节点,和指向大头(第二个链表值比小头的大)的节点,以及需要一个指向和小头的节点。
 ListNode cur1 = head.next; // 指向小头的下一个节点
 ListNode cur2 = head == head1 ? head2 : head1; // 直接指向大头,因为不知道那个是大头,所以需要三目运算符判断一下
 ListNode pre = head;  // 指向小头的节点
  • 最后while循环链表,判断大小,并修改指针

完整代码如下:

class Solution {
    public ListNode mergeTwoLists(ListNode head1, ListNode head2) {
        if(head1 == null || head2 == null){
            return head1 == null ? head2 : head1;
        }

        ListNode head = head1.val <= head2.val ? head1 : head2; // 这个就是最终要返回的小头结点
        ListNode cur1 = head.next; // 指向小头的下一个节点
        ListNode cur2 = head == head1 ? head2 : head1; // 直接指向大头
        ListNode pre = head;
        // 当链表没有循环到空的时候,继续
        while(cur1 != null && cur2 != null){
        	// 如果小头的下一个节点的值(cur1上面已经定义过了,是小头的下一个节点)大于等于大头的值时候。
            if(cur1.val >= cur2.val){ 
                pre.next = cur2; // 修改pre指针指向cur2
                cur2 = cur2.next; // cur2随之向后移动一下。
            }else{
                pre.next = cur1; // 否则,pre指向cur1
                cur1 = cur1.next; // cur1随之向后移动一下。
            }
            pre = pre.next; // 跳它自己的下一个位置,pre节点跳到下一个位置。
        }
        pre.next = cur1 != null ? cur1 : cur2; // 最后,跳出循坏后,pre肯定指向的是null值,所以,我们只需要让她指向下一个不是空链表的链表。
        return head;
    }
}

OK!打完收工!

  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值