算法修炼之路——【链表】Leetcode 21合并两个有序链表

题目描述

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

示例1:

输入: listA= [1, 2, 4], listB = [1, 3, 4]
输出: [1, 1, 2, 3, 4, 4]

思路分析

这道题目为简单难度,我们可以设置一哨兵节点dummyHead,两个遍历链表的指针pA, pB与一个排序部分的尾节点指针tmpTail方便节点的插入。

解题步骤

  1. 初始化两个分区指针pA, pB和哨兵节点dummyHead,及返回链表的尾节点指针tmpTail
  2. 遍历原始链表,判断pA.val, pB.val的大小关系,较小方接入tmpTail.next
  3. pA, pB任一指针为null时,停止遍历;最后判断是否存在未遍历部分,直接接入tmpTail.next.
  4. 返回哨兵节点后置节点

解题代码

    public static ListNode solution(ListNode listA, ListNode listB) {
        if (listA == null) {
            return listB;
        }
        if (listB == null) {
            return listA;
        }

        /* Step1: Init. pointers */
        ListNode dummyHead = new ListNode(0);
        ListNode pA = listA;
        ListNode pB = listB;
        ListNode tmpTail = dummyHead;
        
        /* Step2: go through the head-list
        and
        compare pA.next.val and pB.val
         */
        while (pA != null && pB != null) {
            if(pA.val < pB.val){
                tmpTail.next = pA;
                pA = pA.next;
            }else{
                tmpTail.next = pB;
                pB = pB.next;
            }
            tmpTail = tmpTail.next;
        }
        
        // Step3: connect subsequent if exists
        tmpTail.next = pA == null ? pB : pA;
        /* Step4: return  */
        return dummyHead.next;
    }

复杂度分析

不妨设两个链表的长度分别为m, n:

时间复杂度:我们对两个原始链表进行了一次遍历,容易理解时间复杂度为O(m + n);
空间复杂度:我们这里没有设置辅助容器,故空间复杂度为O(1).

GitHub源码

完整可运行文件请访问GitHub

发布了47 篇原创文章 · 获赞 55 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/u011106767/article/details/105593035