Skip to content

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

题目

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

示例 1:

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

解题思路

方法一、递归:

首先,两个链表存在长短不一致的情况

递归终止条件:当链表1为空时,合并的链表为链表2;当链表2为空时,合并的链表为链表1

之后,链表需要从小到大的有序合并

新增一个合并后链表的头部指针,判断l1和l2的链表的当前位置值谁更小,小的加入到合并链表中,之后合并链表的next就是剩下的两个链表中的最小值。

最后返回合并链表头部

方法二、迭代:

迭代的思路大致和递归一样,但需要一个新的指针,pre记录当前位置的前一个元素,并不断调整他的next指向构建整个合并链表,phead负责合并链表的头部。

如果l1.val<l2.val则,把l1接在pre的后面,同时l1指针向后移动1位。否则就对l2做相同操作

不管将l1和l2中的哪个元素接在了pre后面,pre指针始终需要向后移动1位,因为接了之后next就不为空了,需要移动到下一位继续构建链表

在循环终止的时候,l1和l2可能出现长短不一的情况,至多会有一个是非空的,由于输入的链表都是有序的,所以不管是哪个链表是非空的,它包含的所有元素都比前面已经合并链表中的元素要大,此时只需要将剩下的链表接在pre.next,之后返回合并链表的头部即可

Java代码

java
/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
        if(l1==null) return l2;
        if(l2==null) return l1;
        ListNode mergehead = null;
        if(l1.val<l2.val){
            mergehead = l1;
            mergehead.next = mergeTwoLists(l1.next,l2);
        }else{
            mergehead = l2;
            mergehead.next = mergeTwoLists(l1,l2.next);
        }
        return mergehead;
    }
}

Python代码

python
# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:
    def mergeTwoLists(self, l1: ListNode, l2: ListNode) -> ListNode:
        if not l1: return l2
        if not l2: return l1
        if l1.val<l2.val:
            mergeHead = l1
            mergeHead.next = self.mergeTwoLists(l1.next,l2)
        else:
            mergeHead = l2
            mergeHead.next = self.mergeTwoLists(l1,l2.next)
        return mergeHead

Java代码2

java
/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
        if(l1==null) return l2;
        if(l2==null) return l1;
        ListNode phead = new ListNode(0);
        ListNode pre = phead;
        while(l1!=null&&l2!=null){
            if(l1.val<l2.val){
                pre.next = l1;
                l1 = l1.next;
            }else{
                pre.next = l2;
                l2 = l2.next;
            }
            pre = pre.next;
        }
        if(l1==null) pre.next = l2;
        if(l2==null) pre.next = l1;
        return phead.next;
    }
}