前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >LeetCode-21-合并两个有序链表

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

作者头像
benym
发布2022-07-14 16:08:06
1400
发布2022-07-14 16:08:06
举报
文章被收录于专栏:后端知识体系

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

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

示例 1:

代码语言:javascript
复制
输入: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代码

代码语言:javascript
复制
/**
 * 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代码

代码语言:javascript
复制
# 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

代码语言:javascript
复制
/**
 * 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;
    }
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-06-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • # LeetCode-21-合并两个有序链表
    • # 解题思路
      • # Java代码
        • # Python代码
          • # Java代码2
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档