Offer 驾到,掘友接招!我正在参与2022春招系列活动-刷题打卡任务,点击查看活动详情
描述
输入两个递增的链表,单个链表的长度为n,合并这两个链表并使新链表中的节点仍然是递增排序的。
数据范围: 0≤节点值≤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}
思路
因为已经是排序好的链表,所以思路和排序两个有序数组差不多的。
AC Code
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 {
if pHead1 == nil && pHead2 == nil {
return nil
}
root := new(ListNode)
cur := root
for {
if pHead1 == nil && pHead2 == nil {
break
(1) }else if pHead1 != nil && pHead2 != nil {
(2) if pHead1.Val > pHead2.Val {
cur.Next = pHead2
pHead2 = pHead2.Next
cur = cur.Next
(3) }else{
cur.Next = pHead1
pHead1 = pHead1.Next
cur = cur.Next
}
(4) }else if pHead1 != nil && pHead2 == nil {
cur.Next = pHead1
pHead1 = pHead1.Next
cur = cur.Next
(5) }else {
cur.Next = pHead2
pHead2 = pHead2.Next
cur = cur.Next
}
}
(6) return root.Next
}
- (1) 如果两个链表都不等于nil的话
- (2) 比较两个链表的值大
- (3) 如果是A大,就让B的节点接上去
- (4) 如果一个链表为空,另一个链表不是空,就可以直接把不为空的链表接上去,因为是有序的
- (5) 同理
- (6) 返回结果