面试题 25:合并两个排序的链表

◇◆丶佛笑我妖孽 提交于 2020-03-01 00:13:09

题目描述

输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。

思路

声明一个虚拟头节点

然后开始遍历两个链表

如果

  1. 第一个链表的头节点值小于第二个链表的头节点值,那么就让虚拟头节点指向第一个链表的头节点;

  2. 反之指向第二个链表的头节点;

如果是上面的第一种情况,那么让第一个链表的下一节点与第二链表的头节点继续比较,然后确定新链表的下一个节点是哪个节点;反之亦然。

反复判断,直至其中一个链表到结尾。

最后让没到结尾的链表剩余的节点连接到新链表的末尾。

代码

  • 遍历实现
public class Solution {
    public ListNode Merge(ListNode list1,ListNode list2) {
        if (list1 == null) {
            return list2;
        } else if (list2 == null) {
            return list1;
        }

        ListNode dummyHead = new ListNode(-1);
        ListNode cur = dummyHead;

        // 开始遍历,只要两个链表都还没遍历完
        while (list1 != null && list2 != null) {
            if (list1.val <= list2.val) {
                cur.next = list1;
                list1 = list1.next;
            } else {
                cur.next = list2;
                list2 = list2.next;
            }
            cur = cur.next;
        }

        if (list1 == null) {
            cur.next = list2;
        }
        if (list2 == null) {
            cur.next = list1;
        }

        return dummyHead.next;
    }
}
  • 递归实现
public class Solution {
    public ListNode Merge(ListNode list1,ListNode list2) {
        // 空链表校验
        if (list1 == null) {
            return list2;
        } else if (list2 == null) {
            return list1;
        }

        // 合并后的链表头指针
        ListNode pMergedHead;

        // 节点值得比较
        if (list1.val <= list2.val) {
            // 链表 1 的节点的值小于链表 2 的节点的值
            pMergedHead = list1;
            pMergedHead.next = Merge(list1.next, list2);
        } else {
            // 链表 2 的节点的值小于等于链表 1 的节点的值
            pMergedHead = list2;
            pMergedHead.next = Merge(list1, list2.next);
        }

        return pMergedHead;
    }
}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!