【刷题记录】31.合并两个排序的链表

146 阅读1分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

一、题目描述:

题目来源:LeetCode>合并两个排序的链表

输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。

示例1:

输入:1->2->4, 1->3->4

输出:1->1->2->3->4->4

限制:

0 <= 链表长度 <= 1000

二、思路分析:

思路一:

  1. 这一题是比较简单的一题,可以使用迭代思想求解,我们至于要在while循环中遍历两个链表,比较它们的大小,然后插入到新的链表中即可
  2. 返回的 result.next 因为在初始化的时候,我们的头节点是0 ,这里我们在返回的时候把头掐掉即可
  3. 每次循环记得previousNode也要后移一位
  4. 如果循环结束后还有链表非空,previousNode指向非空链表

思路二:

  1. 递归求解
  2. 如果有一个链表为空,返回另一个链表
  3. 如果l1节点值比l2小,下一个节点应该是l1,应该returnl1
  4. 在return之前,指定l1的下一个节点应该是l1.next和l2俩链表的合并后的头结点
  5. 如果l1节点值比l2大,下一个节点应该是l2,应该return l2
  6. 在return之前,指定l2的下一个节点应该是l1和l2.next俩链表的合并后的头结点

思路三:

  1. 双指针法

三、AC 代码:

思路一:

    class Solution {
        public ListNode mergeTwoLists(ListNode node1, ListNode node2) {
            ListNode result = new ListNode(0);
            ListNode previousNode = result;
            while (node1 != null && node2 != null) {
                if (node1.val >= node2.val) {
                    previousNode.next = node2;
                    node2 = node2.next;
                } else {
                    previousNode.next = node1;
                    node1 = node1.next;
                }
                previousNode = previousNode.next;
            }
            previousNode.next = node1 != null ? node1 : node2;
            return result.next;
        }
    }

思路二:

    class Solution {
        public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
            if (l1 == null || l2 == null) {
                return l1 != null ? l1 : l2;
            }
            if (l1.val <= l2.val) {
                l1.next = mergeTwoLists(l1.next, l2);
                return l1;
            } else {
                l2.next = mergeTwoLists(l1, l2.next);
                return l2;
            }
        }
    }

思路三:

    class Solution {
        public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
            ListNode newHeadNode = new ListNode(0);
            ListNode currentNode = newHeadNode;
            ListNode currentNode1 = l1;
            ListNode currentNode2 = l2;
            while (currentNode1 != null && currentNode2 != null) {
                if (currentNode1.val <= currentNode2.val) {
                    currentNode.next = currentNode1;
                    currentNode = currentNode.next;
                    currentNode1 = currentNode1.next;
                } else {
                    currentNode.next = currentNode2;
                    currentNode = currentNode.next;
                    currentNode2 = currentNode2.next;
                }
            }
            if (currentNode1 == null) {
                currentNode.next = currentNode2;
            } else {
                currentNode.next = currentNode1;
            }
            return newHeadNode.next;
        }
    }