【剑指offer】合并两个排序的链表 [Go语言]

230 阅读1分钟

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) 返回结果