一、题目
牛客题目链接:合并两个排序的链表_牛客题霸_牛客网
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指向新链表的头结点。
然后执行合并操作:
- 如果L1指向的结点值小于等于L2指向的结点值,则将L1指向的结点值链接到cur的next指针,然后L1指向下一个结点值;
- 否则,让L2指向下一个结点值 ;
- 循环步骤1,2,直到L1或者L2为nullptr ;
- 将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;
}
}