【链表】合并两个排序的链表

一、题目

牛客题目链接合并两个排序的链表_牛客题霸_牛客网

LeeCode 题目链接:21. 合并两个有序链表 - 力扣(LeetCode)

题目描述:

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

数据范围: 0≤n≤1000  ,−1000≤节点值≤1000 
要求:空间复杂度 O(1) ,时间复杂度 O(n) 

如输入{1,3,5},{2,4,6}时,合并后的链表为{1,2,3,4,5,6},所以对应的输出为{1,2,3,4,5,6},转换过程如下图所示:

或输入{-1,2,4},{1,3,4}时,合并后的链表为{-1,1,2,3,4,4},所以对应的输出为{-1,1,2,3,4,4},转换过程如下图所示:

示例1

输入: {1,3,5},{2,4,6}

返回值:{1,2,3,4,5,6}

示例2

输入:{},{}

返回值:{}

示例3

输入:{-1,2,4},{1,3,4}

返回值:{-1,1,2,3,4,4}

二、解题思路

首先初始化:定义cur指向新链表的头结点。

然后执行合并操作:

  1. 如果L1指向的结点值小于等于L2指向的结点值,则将L1指向的结点值链接到cur的next指针,然后L1指向下一个结点值;
  2. 否则,让L2指向下一个结点值 ;
  3. 循环步骤1,2,直到L1或者L2为nullptr ;
  4. 将L1或者L2剩下的部分链接到cur的后面;

三、代码实现:

golang:

package main

import . "nc_tools"
/*
 * type ListNode struct{
 *   Val int
 *   Next *ListNode
 * }
 */

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param pHead1 ListNode类 
 * @param pHead2 ListNode类 
 * @return ListNode类
*/
func Merge( pHead1 *ListNode ,  pHead2 *ListNode ) *ListNode {  
    // write code here
    cur:=new(ListNode) //指向新链表最新的节点
    newH:=cur //新链表的头结点
    for pHead1!=nil && pHead2!=nil{ //同时遍历两个链表
        if pHead1.Val<=pHead2.Val{//如果链表1的节点不大于链表2的节点则将其链到新链表上
            cur.Next=pHead1
            pHead1=pHead1.Next
            cur=cur.Next
        }else{//同理,如果链表2的节点小则将其链到新链表的末尾
            cur.Next=pHead2
            pHead2=pHead2.Next
            cur=cur.Next
        }
    }
        //将一方剩下的节点链到新链表的末尾
    if pHead1!=nil{
        cur.Next=pHead1
     }
    if pHead2!=nil{
        cur.Next=pHead2
    }
    return newH.Next

}

java 实现:

import java.util.*;

/*
 * public class ListNode {
 *   int val;
 *   ListNode next = null;
 *   public ListNode(int val) {
 *     this.val = val;
 *   }
 * }
 */

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param pHead1 ListNode类 
     * @param pHead2 ListNode类 
     * @return ListNode类
     */
    public ListNode Merge (ListNode pHead1, ListNode pHead2) {
        // write code here
        if (pHead1 == null) {
            return pHead2;
        }
        if (pHead2 == null) {
            return pHead1;
        }
        if (pHead1.val > pHead2.val ){
            pHead2.next = Merge(pHead1,pHead2.next);
            return pHead2;
        } else {
            pHead1.next = Merge(pHead2,pHead1.next);
            return pHead1;
        }
  
        
    }
}
import java.util.*;

/*
 * public class ListNode {
 *   int val;
 *   ListNode next = null;
 *   public ListNode(int val) {
 *     this.val = val;
 *   }
 * }
 */

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param pHead1 ListNode类
     * @param pHead2 ListNode类
     * @return ListNode类
     */
    public ListNode Merge (ListNode pHead1, ListNode pHead2) {
        // write code here
        ListNode cur = new ListNode(-1);
        ListNode newList = cur;
        while (pHead1 != null & pHead2 != null ) {
            if (pHead1.val > pHead2.val) {
                cur.next = pHead2;
                pHead2 = pHead2.next;
                cur = cur.next;
            } else {
                cur.next = pHead1;
                pHead1 = pHead1.next;
                cur = cur.next;
            }
        }
        if (pHead1 != null ) {
            cur.next = pHead1;
        }
        if (pHead2 != null) {
            cur.next = pHead2;
        }
        return newList.next;

    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值