题解 | #合并两群能量值#

合并两群能量值

https://www.nowcoder.com/practice/d728938f66ac44b5923d4f2e185667ec

知识点:

  1. 单链表的遍历与操作。
  2. 合并两个有序链表。

题意分析:

题目描述了两群牛的能量值,能量值用链表表示,每个节点的值为能量值。每群牛的能量值已经按照非递增顺序排列。现在需要将这两个链表的能量值合并为一个新的非递增链表,并返回这个新链表的头节点。

时间复杂度:

假设两个链表分别有M和N个节点。

  1. 在代码中,我们需要遍历两个链表,将能量值按非递增顺序合并为一个新的链表。在最坏情况下,需要遍历两个链表的所有节点,因此时间复杂度为O(M + N)。

代码分析:

代码中的解决思路是使用两个游标指针l1l2同时遍历两个链表。比较当前节点的值,选择较大的值连接到新链表中,同时将游标指向下一个节点。直到有一个链表走完,就将剩下的链表连接到新链表的尾部。

代码:

import java.util.*;

class ListNode {
    int val;
    ListNode next;

    public ListNode(int val) {
        this.val = val;
    }
}

public class Solution {
    /**
     * 合并两个链表的能量值,返回合并后的链表头节点
     *
     * @param l1 ListNode类 第一个链表的头节点
     * @param l2 ListNode类 第二个链表的头节点
     * @return ListNode类 合并后的链表头节点
     */
    public ListNode mergeEnergyValues(ListNode l1, ListNode l2) {
        // 创建一个临时头结点temp,并初始化一个游标cur指向temp
        ListNode temp = new ListNode(-1);
        ListNode cur = temp;

        // 循环条件:只有当两个链表都不为null才进入循环,只要有一个链表走完了,就跳出循环
        while (l1 != null && l2 != null) {
            int val;
            // 选择值大的那个链表,并将游标指向下一个节点,以便继续比较
            if (l1.val > l2.val) {
                val = l1.val;
                l1 = l1.next;
            } else {
                val = l2.val;
                l2 = l2.next;
            }

            // 利用游标cur连接当前节点,并将游标后移,以便下一次连接
            cur.next = new ListNode(val);
            cur = cur.next;
        }

        // 根据null判断哪个链表已经走到了尾部,选择另外一个没有走完的链表即可
        cur.next = l1 == null ? l2 : l1;

        // 返回合并后的链表头节点(跳过临时头结点temp)
        return temp.next;
    }
}

全部评论

相关推荐

点赞 评论 收藏
分享
09-26 11:48
已编辑
齐鲁工业大学 自动化
迷qwq:比我本科强多了,找个不错的工作问题不大,更好的工作就得看面试表现加上运气了。另外自身经历不错,简历写的不太好,再润色一下。
点赞 评论 收藏
分享
实习完回校有一种割裂感,感觉自己已经不属于校园了,晚上去操场散步看着草坪上的人,尸体暖暖的。
只会说收到好的:身份的转变总是让人百感交集,都经历过这个阶段。我清楚我走在校园里,但是也很清楚不再属于这里了。看着新生在路上欢笑 讨论总是会怀念,可以让自己短暂回忆但是要继续向前走呀 共勉加油
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务